diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netgraph/ng_pppoe.c | 84 |
1 files changed, 65 insertions, 19 deletions
diff --git a/sys/netgraph/ng_pppoe.c b/sys/netgraph/ng_pppoe.c index 77142bb..63eb0d0 100644 --- a/sys/netgraph/ng_pppoe.c +++ b/sys/netgraph/ng_pppoe.c @@ -39,6 +39,11 @@ * $FreeBSD$ * $Whistle: ng_pppoe.c,v 1.7 1999/10/16 10:16:43 julian Exp $ */ +#if 0 +#define AAA printf("pppoe: %s\n", __FUNCTION__ ); +#else +#define AAA +#endif #include <sys/param.h> #include <sys/systm.h> @@ -99,14 +104,6 @@ enum state { PPPOE_CONNECTED, /* [Both] Connection established, Data received */ PPPOE_DEAD /* [Both] */ }; -/* - * Events for the state machine - */ -enum event { - PPPOE_TIMEOUT, /* It's time to do something */ - PPPOE_PACKET, /* a packet has been received. */ - PPPOE_CLOSE /* start shutdown processing */ -}; #define NUMTAGS 20 /* number of tags we are set up to work with */ @@ -194,6 +191,7 @@ get_new_sid(node_p node) u_int16_t val; priv_p privp = node->private; +AAA restart: val = pppoe_sid++; /* @@ -243,6 +241,7 @@ get_tag(struct pppoe_hdr* ph, u_int16_t idx) /* * Keep processing tags while a tag header will still fit. */ +AAA while((char*)(pt + 1) <= end) { /* * If the tag data would go past the end of the packet, abort. @@ -268,6 +267,7 @@ get_tag(struct pppoe_hdr* ph, u_int16_t idx) static void init_tags(sessp sp) { +AAA if(sp->neg == NULL) { printf("pppoe: asked to init NULL neg pointer\n"); return; @@ -281,6 +281,7 @@ insert_tag(sessp sp, struct pppoe_tag *tp) int i; negp neg; +AAA if((neg = sp->neg) == NULL) { printf("pppoe: asked to use NULL neg pointer\n"); return; @@ -309,7 +310,8 @@ make_packet(sessp sp) { int tlen; u_int16_t length = 0; - if ((sp->neg == NULL) || (sp->neg->m = NULL)) { +AAA + if ((sp->neg == NULL) || (sp->neg->m == NULL)) { printf("pppoe: make_packet called from wrong state\n"); } dp = (char *)wh->ph.tag; @@ -349,6 +351,7 @@ pppoe_match_svc(node_p node, char *svc_name, int svc_len) priv_p privp = node->private; hook_p hook; +AAA LIST_FOREACH(hook, &node->hooks, hooks) { /* skip any hook that is debug or ethernet */ @@ -399,6 +402,7 @@ pppoe_findsession(node_p node, struct pppoe_full_hdr *wh) /* * find matching peer/session combination. */ +AAA LIST_FOREACH(hook, &node->hooks, hooks) { /* don't check special hooks */ if ((hook->private == &privp->debug_hook) @@ -425,6 +429,7 @@ pppoe_finduniq(node_p node, struct pppoe_tag *tag) priv_p privp = node->private; union uniq uniq; +AAA bcopy(tag->tag_data, uniq.bytes, sizeof(void *)); /* cycle through all known hooks */ LIST_FOREACH(hook, &node->hooks, hooks) { @@ -461,6 +466,7 @@ ng_PPPoE_constructor(node_p *nodep) priv_p privdata; int error; +AAA /* Initialize private descriptor */ MALLOC(privdata, priv_p, sizeof(*privdata), M_NETGRAPH, M_WAITOK); if (privdata == NULL) @@ -493,6 +499,7 @@ ng_PPPoE_newhook(node_p node, hook_p hook, const char *name) const priv_p privp = node->private; sessp sp; +AAA if (strcmp(name, NG_PPPOE_HOOK_ETHERNET) == 0) { privp->ethernet_hook = hook; hook->private = &privp->ethernet_hook; @@ -513,7 +520,6 @@ ng_PPPoE_newhook(node_p node, hook_p hook, const char *name) hook->private = sp; sp->hook = hook; - callout_handle_init( &sp->neg->timeout_handle); } return(0); } @@ -536,6 +542,7 @@ ng_PPPoE_rcvmsg(node_p node, sessp sp = NULL; negp neg = NULL; +AAA /* Deal with message according to cookie and command */ switch (msg->header.typecookie) { case NGM_PPPOE_COOKIE: @@ -576,10 +583,10 @@ ng_PPPoE_rcvmsg(node_p node, printf("pppoe: Session already active\n"); LEAVE(EISCONN); } + /* * set up prototype header */ - MALLOC(neg, negp, sizeof(*neg), M_NETGRAPH, M_WAITOK); if (neg == NULL) { @@ -589,17 +596,20 @@ ng_PPPoE_rcvmsg(node_p node, bzero(neg, sizeof(*neg)); MGETHDR(neg->m, M_DONTWAIT, MT_DATA); if(neg->m == NULL) { + printf("pppoe: Session out of mbufs\n"); FREE(neg, M_NETGRAPH); LEAVE(ENOBUFS); } neg->m->m_pkthdr.rcvif = NULL; MCLGET(neg->m, M_DONTWAIT); if ((neg->m->m_flags & M_EXT) == 0) { + printf("pppoe: Session out of mcls\n"); m_freem(neg->m); FREE(neg, M_NETGRAPH); LEAVE(ENOBUFS); } sp->neg = neg; + callout_handle_init( &neg->timeout_handle); neg->m->m_len = sizeof(struct pppoe_full_hdr); neg->pkt = mtod(neg->m, union packet*); neg->pkt->pkt_header.eh = eh_prototype; @@ -638,10 +648,11 @@ ng_PPPoE_rcvmsg(node_p node, neg->service.hdr.tag_type = PTT_SRV_NAME; neg->service.hdr.tag_len = htons((u_int16_t)ourmsg->data_len); - bcopy(ourmsg->data, - neg->service.data, ourmsg->data_len); + if (ourmsg->data_len) { + bcopy(ourmsg->data, + neg->service.data, ourmsg->data_len); + } neg->service_len = ourmsg->data_len; - neg->pkt->pkt_header.ph.code = PADI_CODE; pppoe_start(sp); break; case NGM_PPPOE_LISTEN: @@ -651,12 +662,16 @@ ng_PPPoE_rcvmsg(node_p node, * Store the originator of this message so we can send * a success of fail message to them later. * Move the hook to 'LISTENING' + */ neg->service.hdr.tag_type = PTT_SRV_NAME; neg->service.hdr.tag_len = htons((u_int16_t)ourmsg->data_len); - bcopy(ourmsg->data, - neg->service.data, ourmsg->data_len); + + if (ourmsg->data_len) { + bcopy(ourmsg->data, + neg->service.data, ourmsg->data_len); + } neg->service_len = ourmsg->data_len; neg->pkt->pkt_header.ph.code = PADT_CODE; /* @@ -674,8 +689,10 @@ ng_PPPoE_rcvmsg(node_p node, neg->ac_name.hdr.tag_type = PTT_AC_NAME; neg->ac_name.hdr.tag_len = htons((u_int16_t)ourmsg->data_len); - bcopy(ourmsg->data, - neg->ac_name.data, ourmsg->data_len); + if (ourmsg->data_len) { + bcopy(ourmsg->data, + neg->ac_name.data, ourmsg->data_len); + } neg->ac_name_len = ourmsg->data_len; neg->pkt->pkt_header.ph.code = PADO_CODE; /* @@ -703,6 +720,10 @@ quit: return(error); } +/* + * Start a client into the first state. A separate function because + * it can be needed if the negotiation times out. + */ static void pppoe_start(sessp sp) { @@ -714,7 +735,11 @@ pppoe_start(sessp sp) /* * kick the state machine into starting up */ +AAA sp->state = PPPOE_SINIT; + /* reset the packet header to broadcast */ + sp->neg->pkt->pkt_header.eh = eh_prototype; + sp->neg->pkt->pkt_header.ph.code = PADI_CODE; uniqtag.hdr.tag_type = PTT_HOST_UNIQ; uniqtag.hdr.tag_len = htons((u_int16_t)sizeof(uniqtag.data)); uniqtag.data.pointer = sp; @@ -750,6 +775,7 @@ ng_PPPoE_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) } uniqtag; negp neg = NULL; +AAA if (hook->private == &privp->debug_hook) { /* * Data from the debug hook gets sent without modification @@ -764,6 +790,9 @@ ng_PPPoE_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) * use them to decide where to send it. */ +printf("got packet\n"); +LEAVE(0); + privp->packets_in++; m_pullup(m, sizeof(*wh)); /* Checks length */ if (m == NULL) { @@ -1095,6 +1124,11 @@ ng_PPPoE_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) session = ntohs(wh->ph.sid); length = ntohs(wh->ph.length); code = wh->ph.code; + if ( code != PADI_CODE) { + LEAVE(EINVAL); + }; + untimeout(pppoe_ticker, hook, + neg->timeout_handle); /* * This is the first time we hear @@ -1156,6 +1190,7 @@ ng_PPPoE_rmnode(node_p node) { const priv_p privdata = node->private; +AAA node->flags |= NG_INVALID; ng_cutlinks(node); ng_unname(node); @@ -1189,6 +1224,7 @@ ng_PPPoE_disconnect(hook_p hook) priv_p privp = node->private; sessp sp; +AAA if (hook->private == &privp->debug_hook) { privp->debug_hook = NULL; } else if (hook->private == &privp->ethernet_hook) { @@ -1198,8 +1234,14 @@ ng_PPPoE_disconnect(hook_p hook) if (sp->state != PPPOE_SNONE ) { pppoe_send_event(sp, NGM_PPPOE_CLOSE); } - untimeout(pppoe_ticker, hook, sp->neg->timeout_handle); + if (sp->neg) { + untimeout(pppoe_ticker, hook, sp->neg->timeout_handle); + if (sp->neg->m) + m_freem(sp->neg->m); + FREE(sp->neg, M_NETGRAPH); + } FREE(sp, M_NETGRAPH); + hook->private = NULL; } if (node->numhooks == 0) ng_rmnode(node); @@ -1221,6 +1263,7 @@ pppoe_ticker(void *arg) priv_p privp = hook->node->private; meta_p dummy = NULL; +AAA switch(sp->state) { /* * resend the last packet, using an exponential backoff. @@ -1266,6 +1309,7 @@ sendpacket(sessp sp) priv_p privp = hook->node->private; meta_p dummy = NULL; +AAA switch(sp->state) { case PPPOE_LISTENING: case PPPOE_DEAD: @@ -1321,6 +1365,7 @@ scan_tags(sessp sp, struct pppoe_hdr* ph) /* * Keep processing tags while a tag header will still fit. */ +AAA while((char*)(pt + 1) <= end) { /* * If the tag data would go past the end of the packet, abort. @@ -1357,6 +1402,7 @@ pppoe_send_event(sessp sp, enum cmd cmdid) struct ng_mesg *msg; struct ngPPPoE_sts *sts; +AAA NG_MKMESSAGE(msg, NGM_PPPOE_COOKIE, cmdid, sizeof(struct ngPPPoE_sts), M_NOWAIT); sts = (struct ngPPPoE_sts *)msg->data; |