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

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);
        !            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>