diff options
author | julian <julian@FreeBSD.org> | 1999-10-23 04:28:11 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 1999-10-23 04:28:11 +0000 |
commit | bd6712748945561c31293c9a9bbafee61470548b (patch) | |
tree | da0a6d48db55b43982988a91a3e4b738558ea7c8 /sys/netgraph/ng_pppoe.c | |
parent | 309540210a9e865a6d20be7df5e9de244a48b047 (diff) | |
download | FreeBSD-src-bd6712748945561c31293c9a9bbafee61470548b.zip FreeBSD-src-bd6712748945561c31293c9a9bbafee61470548b.tar.gz |
Now that Netgraph is in the system there are some cleanups we can do.
Also save a slightly closer to completion version of the PPPOE code.
Submitted by: Archie Cobbs <archie@freebsd.org>
Diffstat (limited to 'sys/netgraph/ng_pppoe.c')
-rw-r--r-- | sys/netgraph/ng_pppoe.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/sys/netgraph/ng_pppoe.c b/sys/netgraph/ng_pppoe.c index b59dbb3..77142bb 100644 --- a/sys/netgraph/ng_pppoe.c +++ b/sys/netgraph/ng_pppoe.c @@ -174,6 +174,7 @@ static void pppoe_start(sessp sp); static void sendpacket(sessp sp); static void pppoe_ticker(void *arg); static struct pppoe_tag* scan_tags(sessp sp, struct pppoe_hdr* ph); +static int pppoe_send_event(sessp sp, enum cmd cmdid); /************************************************************************* * Some basic utilities from the Linux version with author's permission.* @@ -923,6 +924,7 @@ ng_PPPoE_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) make_packet(sp); sp->state = PPPOE_NEWCONNECTED; sendpacket(sp); + pppoe_send_event(sp, NGM_PPPOE_SUCCESS); /* * Having sent the last Negotiation header, * Set up the stored packet header to @@ -936,6 +938,7 @@ ng_PPPoE_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) sp->pkt_hdr.eh.ether_type = ETHERTYPE_PPPOE_SESS; sp->pkt_hdr.ph.code = 0; + pppoe_send_event(sp, NGM_PPPOE_SUCCESS); break; case PADS_CODE: /* @@ -986,6 +989,7 @@ ng_PPPoE_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) m_freem(neg->m); FREE(sp->neg, M_NETGRAPH); sp->neg = NULL; + pppoe_send_event(sp, NGM_PPPOE_SUCCESS); break; case PADT_CODE: /* @@ -1002,7 +1006,9 @@ ng_PPPoE_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) } /* send message to creator */ /* close hook */ - ng_destroy_hook(sendhook); + if (sendhook) { + ng_destroy_hook(sendhook); + } break; default: LEAVE(EPFNOSUPPORT); @@ -1189,6 +1195,9 @@ ng_PPPoE_disconnect(hook_p hook) privp->ethernet_hook = NULL; } else { sp = hook->private; + if (sp->state != PPPOE_SNONE ) { + pppoe_send_event(sp, NGM_PPPOE_CLOSE); + } untimeout(pppoe_ticker, hook, sp->neg->timeout_handle); FREE(sp, M_NETGRAPH); } @@ -1228,6 +1237,7 @@ pppoe_ticker(void *arg) if ((neg->timeout <<= 1) > PPPOE_TIMEOUT_LIMIT) { if (sp->state == PPPOE_SREQ) { /* revert to SINIT mode */ + pppoe_start(sp); } else { neg->timeout = PPPOE_TIMEOUT_LIMIT; } @@ -1236,7 +1246,6 @@ pppoe_ticker(void *arg) case PPPOE_PRIMED: case PPPOE_SOFFER: /* a timeout on these says "give up" */ - /* XXX should notify creator */ ng_destroy_hook(hook); break; default: @@ -1341,3 +1350,17 @@ scan_tags(sessp sp, struct pppoe_hdr* ph) return NULL; } +static int +pppoe_send_event(sessp sp, enum cmd cmdid) +{ + int error; + struct ng_mesg *msg; + struct ngPPPoE_sts *sts; + + NG_MKMESSAGE(msg, NGM_PPPOE_COOKIE, cmdid, + sizeof(struct ngPPPoE_sts), M_NOWAIT); + sts = (struct ngPPPoE_sts *)msg->data; + strncpy(sts->hook, sp->hook->name, NG_HOOKLEN + 1); + error = ng_send_msg(sp->hook->node, msg, sp->creator, NULL); + return (error); +} |