Annotation of embedaddon/mpd/src/ng.c, revision 1.1.1.2

1.1       misho       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);
1.1.1.2 ! misho      48:   static int   NgSetCommand(Context ctx, int ac, const char *const av[], const void *arg);
1.1       misho      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 },
1.1.1.2 ! misho      78:     { NULL, NULL, NULL, NULL, 0, NULL },
1.1       misho      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
1.1.1.2 ! misho     200: NgSetCommand(Context ctx, int ac, const char *const av[], const void *arg)
1.1       misho     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: {
1.1.1.2 ! misho     228:     (void)l;
1.1       misho     229:     return (1);
                    230: }
                    231: 
                    232: /*
                    233:  * NgPeerAddr()
                    234:  */
                    235: 
                    236: static int
                    237: NgPeerAddr(Link l, void *buf, size_t buf_len)
                    238: {
                    239:     NgInfo     const ng = (NgInfo) l->info;
                    240: 
                    241:     if (buf_len < sizeof(ng->path))
                    242:        return(-1);
                    243: 
                    244:     memcpy(buf, ng->path, sizeof(ng->path));
                    245: 
                    246:     return(0);
                    247: }

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