File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mpd / src / ng.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 08:44:29 2013 UTC (10 years, 11 months ago) by misho
Branches: mpd, MAIN
CVS tags: v5_8p7, v5_8p1_cross, v5_8p1, v5_8, v5_7p0, v5_7, v5_6, HEAD
5.7

    1: 
    2: /*
    3:  * ng.c
    4:  *
    5:  * Written by Archie Cobbs <archie@freebsd.org>
    6:  * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
    7:  * See ``COPYRIGHT.whistle''
    8:  */
    9: 
   10: #include "ppp.h"
   11: #include "ng.h"
   12: #include "phys.h"
   13: #include "ngfunc.h"
   14: #include "log.h"
   15: 
   16: #include <netgraph/ng_message.h>
   17: #include <netgraph/ng_socket.h>
   18: #include <netgraph.h>
   19: 
   20: /*
   21:  * DEFINITIONS
   22:  */
   23: 
   24:   #define NG_MTU		1600
   25:   #define NG_MRU		1600
   26: 
   27:   struct nginfo {
   28:     char	path[NG_PATHSIZ];	/* Node that takes PPP frames */
   29:     char	hook[NG_HOOKSIZ];	/* Hook on that node */
   30:   };
   31:   typedef struct nginfo	*NgInfo;
   32: 
   33:   /* Set menu options */
   34:   enum {
   35:     SET_NODE,
   36:     SET_HOOK
   37:   };
   38: 
   39: /*
   40:  * INTERNAL FUNCTIONS
   41:  */
   42: 
   43:   static int	NgInit(Link l);
   44:   static void	NgOpen(Link l);
   45:   static void	NgClose(Link l);
   46:   static void	NgShutdown(Link l);
   47:   static void	NgStat(Context ctx);
   48:   static int	NgSetCommand(Context ctx, int ac, char *av[], void *arg);
   49:   static int	NgIsSync(Link l);
   50:   static int	NgPeerAddr(Link l, void *buf, size_t buf_len);
   51: 
   52: /*
   53:  * GLOBAL VARIABLES
   54:  */
   55: 
   56:   const struct phystype gNgPhysType = {
   57:     .name		= "ng",
   58:     .descr		= "Netgraph hook",
   59:     .mtu		= NG_MTU,
   60:     .mru		= NG_MRU,
   61:     .tmpl		= 0,
   62:     .init		= NgInit,
   63:     .open		= NgOpen,
   64:     .close		= NgClose,
   65:     .shutdown		= NgShutdown,
   66:     .showstat		= NgStat,
   67:     .issync		= NgIsSync,
   68:     .peeraddr		= NgPeerAddr,
   69:     .callingnum		= NULL,
   70:     .callednum		= NULL,
   71:   };
   72: 
   73:   const struct cmdtab NgSetCmds[] = {
   74:     { "node {path}",		"Set node to attach to",
   75: 	NgSetCommand, NULL, 2, (void *) SET_NODE },
   76:     { "hook {hook}",		"Set hook to attach to",
   77: 	NgSetCommand, NULL, 2, (void *) SET_HOOK },
   78:     { NULL },
   79:   };
   80: 
   81: /*
   82:  * NgInit()
   83:  *
   84:  * Initialize device-specific data in physical layer info
   85:  */
   86: 
   87: static int
   88: NgInit(Link l)
   89: {
   90:     NgInfo	ng;
   91: 
   92:     /* Allocate private struct */
   93:     ng = (NgInfo) (l->info = Malloc(MB_PHYS, sizeof(*ng)));
   94:     snprintf(ng->path, sizeof(ng->path), "undefined:");
   95:     snprintf(ng->hook, sizeof(ng->hook), "undefined");
   96: 
   97:     /* Done */
   98:     return(0);
   99: }
  100: 
  101: /*
  102:  * NgOpen()
  103:  */
  104: 
  105: static void
  106: NgOpen(Link l)
  107: {
  108:     NgInfo	const ng = (NgInfo) l->info;
  109:     char	path[NG_PATHSIZ];
  110:     int		csock = -1;
  111:     struct ngm_connect	cn;
  112: 
  113:     if (!PhysGetUpperHook(l, path, cn.ourhook)) {
  114:         Log(LG_PHYS, ("[%s] NG: can't get upper hook", l->name));
  115: 	goto fail;
  116:     }
  117:     
  118:     /* Get a temporary netgraph socket node */
  119:     if (NgMkSockNode(NULL, &csock, NULL) == -1) {
  120: 	Perror("[%s] NG: NgMkSockNode", l->name);
  121: 	goto fail;
  122:     }
  123: 
  124:     strlcpy(cn.path, ng->path, sizeof(cn.path));
  125:     strlcpy(cn.peerhook, ng->hook, sizeof(cn.peerhook));
  126:     if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE, NGM_CONNECT, &cn, sizeof(cn)) < 0) {
  127: 	Perror("[%s] NG: can't connect \"%s\"->\"%s\" and \"%s\"->\"%s\"",
  128: 	    l->name, path, cn.ourhook, cn.path, cn.peerhook);
  129: 	goto fail;
  130:     }
  131:     
  132:     close(csock);
  133:     l->state = PHYS_STATE_UP;
  134:     PhysUp(l);
  135:     return;
  136: 
  137: fail:
  138:     if (csock>=0) {
  139: 	close(csock);
  140: 	csock = -1;
  141:     }
  142:     l->state = PHYS_STATE_DOWN;
  143:     PhysDown(l, STR_CON_FAILED0, NULL);
  144: }
  145: 
  146: /*
  147:  * NgClose()
  148:  */
  149: 
  150: static void
  151: NgClose(Link l)
  152: {
  153:     NgInfo	const ng = (NgInfo) l->info;
  154:     int		csock = -1;
  155: 
  156:     /* Get a temporary netgraph socket node */
  157:     if (NgMkSockNode(NULL, &csock, NULL) == -1) {
  158: 	Perror("[%s] NG: NgMkSockNode", l->name);
  159: 	goto fail;
  160:     }
  161: 
  162:     NgFuncDisconnect(csock, l->name, ng->path, ng->hook);
  163: 
  164:     close(csock);
  165:     /* FALL */
  166: 
  167: fail:
  168:     l->state = PHYS_STATE_DOWN;
  169:     PhysDown(l, STR_MANUALLY, NULL);
  170: }
  171: 
  172: /*
  173:  * NgShutdown()
  174:  */
  175: static void
  176: NgShutdown(Link l)
  177: {
  178:     Freee(l->info);
  179: }
  180: 
  181: /*
  182:  * NgStat()
  183:  */
  184: 
  185: void
  186: NgStat(Context ctx)
  187: {
  188:     NgInfo	const ng = (NgInfo) ctx->lnk->info;
  189: 
  190:     Printf("Netgraph node configuration:\r\n");
  191:     Printf("\tNode : %s\r\n", ng->path);
  192:     Printf("\tHook : %s\r\n", ng->hook);
  193: }
  194: 
  195: /*
  196:  * NgSetCommand()
  197:  */
  198: 
  199: static int
  200: NgSetCommand(Context ctx, int ac, char *av[], void *arg)
  201: {
  202:     NgInfo	const ng = (NgInfo) ctx->lnk->info;
  203: 
  204:     switch ((intptr_t)arg) {
  205: 	case SET_NODE:
  206:     	    if (ac != 1)
  207: 		return(-1);
  208:     	    strlcpy(ng->path, av[0], sizeof(ng->path));
  209:     	    break;
  210: 	case SET_HOOK:
  211:     	    if (ac != 1)
  212: 		return(-1);
  213:     	    strlcpy(ng->hook, av[0], sizeof(ng->hook));
  214:     	    break;
  215: 	default:
  216:     	    assert(0);
  217:     }
  218:     return(0);
  219: }
  220: 
  221: /*
  222:  * NgIsSync()
  223:  */
  224: 
  225: static int
  226: NgIsSync(Link l)
  227: {
  228:     return (1);
  229: }
  230: 
  231: /*
  232:  * NgPeerAddr()
  233:  */
  234: 
  235: static int
  236: NgPeerAddr(Link l, void *buf, size_t buf_len)
  237: {
  238:     NgInfo	const ng = (NgInfo) l->info;
  239: 
  240:     if (buf_len < sizeof(ng->path))
  241: 	return(-1);
  242: 
  243:     memcpy(buf, ng->path, sizeof(ng->path));
  244: 
  245:     return(0);
  246: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>