From 808098413cd36aa54605c519abddf2fbaf6b511b Mon Sep 17 00:00:00 2001 From: Sylvain Rochet Date: Sun, 15 Feb 2015 00:35:45 +0100 Subject: [PATCH] PPP: removed PPPoE and PPPoL2TP callback status notifier Added necessary PPP core functions for PPPoE and PPPoL2TP status notificaton (ppp_link_failed and ppp_link_end), removed callback, low level protocol are now calling PPP core "link" functions. --- src/include/netif/ppp/ppp_impl.h | 9 ++++ src/include/netif/ppp/pppoe.h | 6 --- src/include/netif/ppp/pppol2tp.h | 6 --- src/netif/ppp/ppp.c | 86 ++++++-------------------------- src/netif/ppp/pppoe.c | 18 ++----- src/netif/ppp/pppol2tp.c | 8 ++- 6 files changed, 33 insertions(+), 100 deletions(-) diff --git a/src/include/netif/ppp/ppp_impl.h b/src/include/netif/ppp/ppp_impl.h index 70c4afff..33272487 100644 --- a/src/include/netif/ppp/ppp_impl.h +++ b/src/include/netif/ppp/ppp_impl.h @@ -370,6 +370,15 @@ ppp_pcb *ppp_new(struct netif *pppif, ppp_link_status_cb_fn link_status_cb, void /* initialize the PPP subsystem */ int ppp_init(void); +/* Initiate LCP open request */ +void ppp_start(ppp_pcb *pcb); + +/* Called when link failed to setup */ +void ppp_link_failed(ppp_pcb *pcb); + +/* Called when link is normally down (i.e. it was asked to end) */ +void ppp_link_end(ppp_pcb *pcb); + /* function called by pppoe.c */ void ppp_input(ppp_pcb *pcb, struct pbuf *pb); diff --git a/src/include/netif/ppp/pppoe.h b/src/include/netif/ppp/pppoe.h index 26e1f49f..1f295763 100644 --- a/src/include/netif/ppp/pppoe.h +++ b/src/include/netif/ppp/pppoe.h @@ -112,10 +112,6 @@ PACK_STRUCT_END /* passive */ #define PPPOE_STATE_PADO_SENT 1 -#define PPPOE_CB_STATE_UP 0 /* PPPoE link is UP */ -#define PPPOE_CB_STATE_DOWN 1 /* PPPoE link is DOWN - normal condition */ -#define PPPOE_CB_STATE_FAILED 2 /* Failed to setup PPPoE link */ - #define PPPOE_HEADERLEN sizeof(struct pppoehdr) #define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */ @@ -144,7 +140,6 @@ struct pppoe_softc { struct pppoe_softc *next; struct netif *sc_ethif; /* ethernet interface we are using */ ppp_pcb *pcb; /* PPP PCB */ - void (*sc_link_status_cb)(ppp_pcb *pcb, int up); struct eth_addr sc_dest; /* hardware address of concentrator */ u16_t sc_session; /* PPPoE session id */ @@ -168,7 +163,6 @@ struct pppoe_softc { #define pppoe_init() /* compatibility define, no initialization needed */ ppp_pcb *pppoe_create(struct netif *pppif, - void (*link_status_cb_ll)(ppp_pcb *pcb, int up), struct netif *ethif, ppp_link_status_cb_fn link_status_cb, void *ctx_cb); err_t pppoe_destroy(struct pppoe_softc *sc); diff --git a/src/include/netif/ppp/pppol2tp.h b/src/include/netif/ppp/pppol2tp.h index f086feed..4328f2bd 100644 --- a/src/include/netif/ppp/pppol2tp.h +++ b/src/include/netif/ppp/pppol2tp.h @@ -155,10 +155,6 @@ #define PPPOL2TP_STATE_ICCN_SENT 3 #define PPPOL2TP_STATE_DATA 4 -#define PPPOL2TP_CB_STATE_UP 0 /* PPPoL2TP link is UP */ -#define PPPOL2TP_CB_STATE_DOWN 1 /* PPPo2TP link is DOWN - normal condition */ -#define PPPOL2TP_CB_STATE_FAILED 2 /* Failed to setup PPPo2TP link */ - #define PPPOL2TP_OUTPUT_DATA_HEADER_LEN 6 /* Our data header len */ /* @@ -168,7 +164,6 @@ typedef struct pppol2tp_pcb_s pppol2tp_pcb; struct pppol2tp_pcb_s { ppp_pcb *ppp; /* PPP PCB */ u8_t phase; /* L2TP phase */ - void (*link_status_cb)(ppp_pcb *pcb, int status); struct udp_pcb *udp; /* UDP L2TP Socket */ struct netif *netif; /* Output interface, used as a default route */ ip_addr_t remote_ip; /* LNS IP Address */ @@ -198,7 +193,6 @@ struct pppol2tp_pcb_s { /* Create a new L2TP session. */ ppp_pcb *pppol2tp_create(struct netif *pppif, - void (*link_status_cb_ll)(ppp_pcb *pcb, int status), struct netif *netif, ip_addr_t *ipaddr, u16_t port, u8_t *secret, u8_t secret_len, ppp_link_status_cb_fn link_status_cb, void *ctx_cb); diff --git a/src/netif/ppp/ppp.c b/src/netif/ppp/ppp.c index cbae6cad..b8e35cec 100644 --- a/src/netif/ppp/ppp.c +++ b/src/netif/ppp/ppp.c @@ -185,7 +185,6 @@ const struct protent* const protocols[] = { /* Prototypes for procedures local to this file. */ static void ppp_clear(ppp_pcb *pcb); static void ppp_do_open(void *arg); -static void ppp_start(ppp_pcb *pcb); /** Initiate LCP open request */ static void ppp_stop(ppp_pcb *pcb); static void ppp_hup(ppp_pcb *pcb); @@ -252,23 +251,19 @@ void ppp_set_xaccm(ppp_pcb *pcb, ext_accm *accm) { #endif /* PPPOS_SUPPORT */ #if PPPOE_SUPPORT -static void ppp_over_ethernet_link_status_cb(ppp_pcb *pcb, int state); - ppp_pcb *ppp_over_ethernet_create(struct netif *pppif, struct netif *ethif, const char *service_name, const char *concentrator_name, ppp_link_status_cb_fn link_status_cb, void *ctx_cb) { LWIP_UNUSED_ARG(service_name); LWIP_UNUSED_ARG(concentrator_name); - return pppoe_create(pppif, ppp_over_ethernet_link_status_cb, ethif, link_status_cb, ctx_cb); + return pppoe_create(pppif, ethif, link_status_cb, ctx_cb); } #endif /* PPPOE_SUPPORT */ #if PPPOL2TP_SUPPORT -static void ppp_over_l2tp_link_status_cb(ppp_pcb *pcb, int state); - ppp_pcb *ppp_over_l2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port, u8_t *secret, u8_t secret_len, ppp_link_status_cb_fn link_status_cb, void *ctx_cb) { - return pppol2tp_create(pppif, ppp_over_l2tp_link_status_cb, netif, ipaddr, port, secret, secret_len, link_status_cb, ctx_cb); + return pppol2tp_create(pppif, netif, ipaddr, port, secret, secret_len, link_status_cb, ctx_cb); } #endif /* PPPOL2TP_SUPPORT */ @@ -598,13 +593,26 @@ static void ppp_do_open(void *arg) { } /** Initiate LCP open request */ -static void ppp_start(ppp_pcb *pcb) { +void ppp_start(ppp_pcb *pcb) { PPPDEBUG(LOG_DEBUG, ("ppp_start: unit %d\n", pcb->num)); lcp_open(pcb); /* Start protocol */ lcp_lowerup(pcb); PPPDEBUG(LOG_DEBUG, ("ppp_start: finished\n")); } +/** Called when link failed to setup */ +void ppp_link_failed(ppp_pcb *pcb) { + PPPDEBUG(LOG_DEBUG, ("ppp_failed: unit %d\n", pcb->num)); + new_phase(pcb, PPP_PHASE_DEAD); + pcb->link_status_cb(pcb, PPPERR_OPEN, pcb->ctx_cb); +} + +/** Called when link is normally down (i.e. it was asked to end) */ +void ppp_link_end(ppp_pcb *pcb) { + PPPDEBUG(LOG_DEBUG, ("ppp_end: unit %d\n", pcb->num)); + pcb->link_status_cb(pcb, PPPERR_CONNECT, pcb->ctx_cb); +} + /** LCP close request */ static void ppp_stop(ppp_pcb *pcb) { PPPDEBUG(LOG_DEBUG, ("ppp_stop: unit %d\n", pcb->num)); @@ -1800,37 +1808,6 @@ struct pbuf * ppp_singlebuf(struct pbuf *p) { } #if PPPOE_SUPPORT -static void ppp_over_ethernet_link_status_cb(ppp_pcb *pcb, int state) { - int pppoe_err_code = PPPERR_NONE; - - switch(state) { - - /* PPPoE link is established, starting PPP negotiation */ - case PPPOE_CB_STATE_UP: - PPPDEBUG(LOG_INFO, ("ppp_over_ethernet_link_status_cb: unit %d: UP, connecting\n", pcb->num)); - ppp_start(pcb); - return; - - /* PPPoE link normally down (i.e. asked to do so) */ - case PPPOE_CB_STATE_DOWN: - PPPDEBUG(LOG_INFO, ("ppp_over_ethernet_link_status_cb: unit %d: DOWN, disconnected\n", pcb->num)); - pppoe_err_code = PPPERR_CONNECT; - break; - - /* PPPoE link failed to setup (i.e. PADI/PADO timeout) */ - case PPPOE_CB_STATE_FAILED: - PPPDEBUG(LOG_INFO, ("ppp_over_ethernet_link_status_cb: unit %d: FAILED, aborting\n", pcb->num)); - pppoe_err_code = PPPERR_OPEN; - new_phase(pcb, PPP_PHASE_DEAD); - break; - - default: - break; - } - - pcb->link_status_cb(pcb, pcb->err_code ? pcb->err_code : pppoe_err_code, pcb->ctx_cb); -} - static void ppp_over_ethernet_open(ppp_pcb *pcb) { lcp_options *wo = &pcb->lcp_wantoptions; @@ -1853,37 +1830,6 @@ static void ppp_over_ethernet_open(ppp_pcb *pcb) { #endif /* PPPOE_SUPPORT */ #if PPPOL2TP_SUPPORT -static void ppp_over_l2tp_link_status_cb(ppp_pcb *pcb, int state) { - int pppol2tp_err_code = PPPERR_NONE; - - switch(state) { - - /* PPPoL2TP link is established, starting PPP negotiation */ - case PPPOL2TP_CB_STATE_UP: - PPPDEBUG(LOG_INFO, ("ppp_over_l2tp_link_status_cb: unit %d: UP, connecting\n", pcb->num)); - ppp_start(pcb); - return; - - /* PPPoL2TP link normally down (i.e. asked to do so) */ - case PPPOL2TP_CB_STATE_DOWN: - PPPDEBUG(LOG_INFO, ("ppp_over_l2tp_link_status_cb: unit %d: DOWN, disconnected\n", pcb->num)); - pppol2tp_err_code = PPPERR_CONNECT; - break; - - /* PPPoL2TP link failed to setup (i.e. L2TP timeout) */ - case PPPOL2TP_CB_STATE_FAILED: - PPPDEBUG(LOG_INFO, ("ppp_over_l2tp_link_status_cb: unit %d: FAILED, aborting\n", pcb->num)); - pppol2tp_err_code = PPPERR_OPEN; - new_phase(pcb, PPP_PHASE_DEAD); - break; - - default: - break; - } - - pcb->link_status_cb(pcb, pcb->err_code ? pcb->err_code : pppol2tp_err_code, pcb->ctx_cb); -} - static void ppp_over_l2tp_open(ppp_pcb *pcb) { lcp_options *wo = &pcb->lcp_wantoptions; diff --git a/src/netif/ppp/pppoe.c b/src/netif/ppp/pppoe.c index 9a27f809..16859f84 100644 --- a/src/netif/ppp/pppoe.c +++ b/src/netif/ppp/pppoe.c @@ -138,7 +138,6 @@ static struct pppoe_softc *pppoe_softc_list; ppp_pcb* pppoe_create(struct netif *pppif, - void (*link_status_cb_ll)(ppp_pcb *pcb, int up), struct netif *ethif, ppp_link_status_cb_fn link_status_cb, void *ctx_cb) { @@ -161,7 +160,6 @@ pppoe_create(struct netif *pppif, MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest)); sc->pcb = ppp; - sc->sc_link_status_cb = link_status_cb_ll; sc->sc_ethif = ethif; /* put the new interface at the head of the list */ @@ -272,12 +270,6 @@ static struct pppoe_softc* pppoe_find_softc_by_hunique(u8_t *token, size_t len, return sc; } -static void -pppoe_linkstatus_up(struct pppoe_softc *sc) -{ - sc->sc_link_status_cb(sc->pcb, PPPOE_CB_STATE_UP); -} - /* analyze and handle a single received packet while not in session state */ void pppoe_disc_input(struct netif *netif, struct pbuf *pb) @@ -485,7 +477,7 @@ breakbreak:; } pppoe_send_pads(sc); sc->sc_state = PPPOE_STATE_SESSION; - pppoe_linkstatus_up(sc); /* notify upper layers */ + ppp_start(sc->pcb); /* notify upper layers */ break; #else /* ignore, we are no access concentrator */ @@ -524,7 +516,7 @@ breakbreak:; sys_untimeout(pppoe_timeout, sc); PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": session 0x%x connected\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, session)); sc->sc_state = PPPOE_STATE_SESSION; - pppoe_linkstatus_up(sc); /* notify upper layers */ + ppp_start(sc->pcb); /* notify upper layers */ break; case PPPOE_CODE_PADT: if (sc == NULL) { @@ -852,7 +844,7 @@ pppoe_disconnect(struct pppoe_softc *sc) sc->sc_padi_retried = 0; sc->sc_padr_retried = 0; - sc->sc_link_status_cb(sc->pcb, PPPOE_CB_STATE_DOWN); /* notify upper layers */ + ppp_link_end(sc->pcb); /* notify upper layers */ return; } @@ -870,7 +862,7 @@ pppoe_abort_connect(struct pppoe_softc *sc) sc->sc_padi_retried = 0; sc->sc_padr_retried = 0; - sc->sc_link_status_cb(sc->pcb, PPPOE_CB_STATE_FAILED); /* notify upper layers */ + ppp_link_failed(sc->pcb); /* notify upper layers */ } /* Send a PADR packet */ @@ -1109,7 +1101,7 @@ pppoe_clear_softc(struct pppoe_softc *sc, const char *message) sc->sc_state = PPPOE_STATE_INITIAL; /* notify upper layers */ - sc->sc_link_status_cb(sc->pcb, PPPOE_CB_STATE_DOWN); + ppp_link_end(sc->pcb); /* clean up softc */ MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest)); diff --git a/src/netif/ppp/pppol2tp.c b/src/netif/ppp/pppol2tp.c index 297ebdc2..91339619 100644 --- a/src/netif/ppp/pppol2tp.c +++ b/src/netif/ppp/pppol2tp.c @@ -88,7 +88,6 @@ static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns); /* Create a new L2TP session. */ ppp_pcb *pppol2tp_create(struct netif *pppif, - void (*link_status_cb_ll)(ppp_pcb *pcb, int status), struct netif *netif, ip_addr_t *ipaddr, u16_t port, u8_t *secret, u8_t secret_len, ppp_link_status_cb_fn link_status_cb, void *ctx_cb) { ppp_pcb *ppp; @@ -118,7 +117,6 @@ ppp_pcb *pppol2tp_create(struct netif *pppif, l2tp->phase = PPPOL2TP_STATE_INITIAL; l2tp->ppp = ppp; l2tp->udp = udp; - l2tp->link_status_cb = link_status_cb_ll; l2tp->netif = netif; ip_addr_set(&l2tp->remote_ip, ipaddr); l2tp->remote_port = port; @@ -188,7 +186,7 @@ void pppol2tp_disconnect(pppol2tp_pcb *l2tp) { pppol2tp_send_stopccn(l2tp, l2tp->our_ns); pppol2tp_clear(l2tp); - l2tp->link_status_cb(l2tp->ppp, PPPOL2TP_CB_STATE_DOWN); /* notify upper layers */ + ppp_link_end(l2tp->ppp); /* notify upper layers */ } /* UDP Callback for incoming L2TP frames */ @@ -523,7 +521,7 @@ nextavp: l2tp->iccn_retried = 0; l2tp->phase = PPPOL2TP_STATE_ICCN_SENT; l2tp->our_ns++; - l2tp->link_status_cb(l2tp->ppp, PPPOL2TP_CB_STATE_UP); /* notify upper layers */ + ppp_start(l2tp->ppp); /* notify upper layers */ if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) { PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err)); } @@ -615,7 +613,7 @@ static void pppol2tp_timeout(void *arg) { static void pppol2tp_abort_connect(pppol2tp_pcb *l2tp) { PPPDEBUG(LOG_DEBUG, ("pppol2tp: could not establish connection\n")); pppol2tp_clear(l2tp); - l2tp->link_status_cb(l2tp->ppp, PPPOL2TP_CB_STATE_FAILED); /* notify upper layers */ + ppp_link_failed(l2tp->ppp); /* notify upper layers */ } /* Reset L2TP control block to its initial state */