Changeset View
Changeset View
Standalone View
Standalone View
src/pppoe.c
Context not available. | |||||
/* Per link private info */ | /* Per link private info */ | ||||
struct pppoeinfo { | struct pppoeinfo { | ||||
char iface[IFNAMSIZ]; /* PPPoE interface name */ | |||||
char path[MAX_PATH]; /* PPPoE node path */ | char path[MAX_PATH]; /* PPPoE node path */ | ||||
char hook[NG_HOOKSIZ]; /* hook on that node */ | char hook[NG_HOOKSIZ]; /* hook on that node */ | ||||
char session[MAX_SESSION]; /* session name */ | char session[MAX_SESSION]; /* session name */ | ||||
Context not available. | |||||
static int PppoeUnListen(Link l); | static int PppoeUnListen(Link l); | ||||
static void PppoeNodeUpdate(Link l); | static void PppoeNodeUpdate(Link l); | ||||
static void PppoeListenEvent(int type, void *arg); | static void PppoeListenEvent(int type, void *arg); | ||||
static int CreatePppoeNode(struct PppoeIf *PIf, const char *path, const char *hook); | static int CreatePppoeNode(struct PppoeIf *PIf, const char *iface, const char *path, const char *hook); | ||||
static void PppoeDoClose(Link l); | static void PppoeDoClose(Link l); | ||||
Context not available. | |||||
pe = (PppoeInfo)(l->info = Malloc(MB_PHYS, sizeof(*pe))); | pe = (PppoeInfo)(l->info = Malloc(MB_PHYS, sizeof(*pe))); | ||||
pe->incoming = 0; | pe->incoming = 0; | ||||
pe->opened = 0; | pe->opened = 0; | ||||
snprintf(pe->iface, sizeof(pe->iface), "undefined"); | |||||
snprintf(pe->path, sizeof(pe->path), "undefined:"); | snprintf(pe->path, sizeof(pe->path), "undefined:"); | ||||
snprintf(pe->hook, sizeof(pe->hook), "undefined"); | snprintf(pe->hook, sizeof(pe->hook), "undefined"); | ||||
snprintf(pe->session, sizeof(pe->session), "*"); | snprintf(pe->session, sizeof(pe->session), "*"); | ||||
Context not available. | |||||
break; | break; | ||||
} | } | ||||
#endif | #endif | ||||
#ifdef NGM_PPPOE_PADM_COOKIE | |||||
case NGM_PPPOE_HURL: | |||||
Log(LG_PHYS, ("PPPoE: rec'd HURL \"%s\"", | |||||
((struct ngpppoe_padm *)u.resp.data)->msg)); | |||||
break; | |||||
case NGM_PPPOE_MOTM: | |||||
Log(LG_PHYS, ("PPPoE: rec'd MOTM \"%s\"", | |||||
((struct ngpppoe_padm *)u.resp.data)->msg)); | |||||
break; | |||||
#endif | |||||
default: | default: | ||||
Log(LG_PHYS, ("PPPoE: rec'd command %lu from \"%s\"", | Log(LG_PHYS, ("PPPoE: rec'd command %lu from \"%s\"", | ||||
(u_long)u.resp.header.cmd, path)); | (u_long)u.resp.header.cmd, path)); | ||||
Context not available. | |||||
} | } | ||||
Printf("PPPoE configuration:\r\n"); | Printf("PPPoE configuration:\r\n"); | ||||
Printf("\tIface Name : %s\r\n", pe->iface); | |||||
Printf("\tIface Node : %s\r\n", pe->path); | Printf("\tIface Node : %s\r\n", pe->path); | ||||
Printf("\tIface Hook : %s\r\n", pe->hook); | Printf("\tIface Hook : %s\r\n", pe->hook); | ||||
Printf("\tSession : %s\r\n", pe->session); | Printf("\tSession : %s\r\n", pe->session); | ||||
Context not available. | |||||
PppoePeerIface(Link l, void *buf, size_t buf_len) | PppoePeerIface(Link l, void *buf, size_t buf_len) | ||||
{ | { | ||||
PppoeInfo const pppoe = (PppoeInfo)l->info; | PppoeInfo const pppoe = (PppoeInfo)l->info; | ||||
char iface[IFNAMSIZ]; | |||||
strlcpy(iface, pppoe->path, sizeof(iface)); | strlcpy(buf, pppoe->iface, buf_len); | ||||
if (iface[strlen(iface) - 1] == ':') | |||||
iface[strlen(iface) - 1] = '\0'; | |||||
strlcpy(buf, iface, buf_len); | |||||
return (0); | return (0); | ||||
} | } | ||||
Context not available. | |||||
} | } | ||||
static int | static int | ||||
CreatePppoeNode(struct PppoeIf *PIf, const char *path, const char *hook) | CreatePppoeNode(struct PppoeIf *PIf, const char *iface, const char *path, const char *hook) | ||||
{ | { | ||||
union { | union { | ||||
u_char buf[sizeof(struct ng_mesg) + 2048]; | u_char buf[sizeof(struct ng_mesg) + 2048]; | ||||
Context not available. | |||||
uint32_t f; | uint32_t f; | ||||
/* Make sure interface is up. */ | /* Make sure interface is up. */ | ||||
char iface[IFNAMSIZ]; | |||||
strlcpy(iface, path, sizeof(iface)); | |||||
if (iface[strlen(iface) - 1] == ':') | |||||
iface[strlen(iface) - 1] = '\0'; | |||||
if (ExecCmdNosh(LG_PHYS2, iface, "%s %s up", _PATH_IFCONFIG, iface) != 0) { | if (ExecCmdNosh(LG_PHYS2, iface, "%s %s up", _PATH_IFCONFIG, iface) != 0) { | ||||
Log(LG_ERR, ("PPPoE: can't bring up interface %s", | Log(LG_ERR, ("PPPoE: can't bring up interface %s", | ||||
iface)); | iface)); | ||||
Context not available. | |||||
l->name)); | l->name)); | ||||
return; | return; | ||||
} | } | ||||
if (CreatePppoeNode(&PppoeIfs[free], pi->path, pi->hook)) { | if (CreatePppoeNode(&PppoeIfs[free], pi->iface, pi->path, pi->hook)) { | ||||
strlcpy(PppoeIfs[free].ifnodepath, | strlcpy(PppoeIfs[free].ifnodepath, | ||||
pi->path, | pi->path, | ||||
sizeof(PppoeIfs[free].ifnodepath)); | sizeof(PppoeIfs[free].ifnodepath)); | ||||
Context not available. | |||||
{ | { | ||||
const PppoeInfo pi = (PppoeInfo) ctx->lnk->info; | const PppoeInfo pi = (PppoeInfo) ctx->lnk->info; | ||||
const char *hookname = ETHER_DEFAULT_HOOK; | const char *hookname = ETHER_DEFAULT_HOOK; | ||||
const char *colon; | int i; | ||||
#ifdef NGM_PPPOE_SETMAXP_COOKIE | #ifdef NGM_PPPOE_SETMAXP_COOKIE | ||||
int ap; | int ap; | ||||
#endif | #endif | ||||
Context not available. | |||||
hookname = av[1]; | hookname = av[1]; | ||||
/* fall through */ | /* fall through */ | ||||
case 1: | case 1: | ||||
colon = (av[0][strlen(av[0]) - 1] == ':') ? "" : ":"; | strlcpy(pi->iface, av[0], sizeof(pi->iface)); | ||||
snprintf(pi->path, sizeof(pi->path), | strlcpy(pi->path, pi->iface, sizeof(pi->path) - 1); | ||||
"%s%s", av[0], colon); | for (i = 0; i < sizeof(pi->path) - 1; i++) { | ||||
if (pi->path[i] == '.' || pi->path[i] == ':') | |||||
pi->path[i] = '_'; | |||||
else if (pi->path[i] == '\0') { | |||||
pi->path[i] = ':'; | |||||
pi->path[i + 1] = '\0'; | |||||
break; | |||||
} | |||||
} | |||||
strlcpy(pi->hook, hookname, sizeof(pi->hook)); | strlcpy(pi->hook, hookname, sizeof(pi->hook)); | ||||
break; | break; | ||||
default: | default: | ||||
Context not available. |