From 0afc34f6fc9671792cebcffa09064586fe3458de Mon Sep 17 00:00:00 2001 From: Sylvain Rochet Date: Sun, 15 Feb 2015 11:04:09 +0100 Subject: [PATCH] PPP, moved ppp_write and ppp_netif_output low level protocols functions to respective low level protocol files Moved ppp_write_over_ethernet() and ppp_netif_output_over_ethernet() to pppoe.c Moved ppp_write_over_l2tp() and ppp_netif_output_over_l2tp() to pppol2tp.c --- src/include/netif/ppp/ppp.h | 4 +- src/include/netif/ppp/pppoe.h | 2 - src/include/netif/ppp/pppol2tp.h | 3 - src/netif/ppp/ppp.c | 180 +------------------------------ src/netif/ppp/pppoe.c | 97 ++++++++++++++++- src/netif/ppp/pppol2tp.c | 96 ++++++++++++++++- 6 files changed, 193 insertions(+), 189 deletions(-) diff --git a/src/include/netif/ppp/ppp.h b/src/include/netif/ppp/ppp.h index 8ab0a7c5..1cc987dd 100644 --- a/src/include/netif/ppp/ppp.h +++ b/src/include/netif/ppp/ppp.h @@ -350,8 +350,8 @@ typedef struct ppp_pcb_rx_s { * PPP interface control block. */ typedef void (*link_command_cb_fn)(void *pcb, u8_t command); -typedef void (*link_write_cb_fn)(void *pcb, struct pbuf *p); -typedef void (*link_netif_output_cb_fn)(void *pcb, struct pbuf *p, u_short protocol); +typedef int (*link_write_cb_fn)(void *pcb, struct pbuf *p); +typedef err_t (*link_netif_output_cb_fn)(void *pcb, struct pbuf *p, u_short protocol); struct ppp_pcb_s { /* -- below are data that will NOT be cleared between two sessions */ diff --git a/src/include/netif/ppp/pppoe.h b/src/include/netif/ppp/pppoe.h index 126ead12..c5cc978c 100644 --- a/src/include/netif/ppp/pppoe.h +++ b/src/include/netif/ppp/pppoe.h @@ -169,8 +169,6 @@ ppp_pcb *pppoe_create(struct netif *pppif, void pppoe_disc_input(struct netif *netif, struct pbuf *p); void pppoe_data_input(struct netif *netif, struct pbuf *p); -err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb); - #endif /* PPP_OE_H */ #endif /* PPP_SUPPORT && PPPOE_SUPPORT */ diff --git a/src/include/netif/ppp/pppol2tp.h b/src/include/netif/ppp/pppol2tp.h index b40af175..be8459f3 100644 --- a/src/include/netif/ppp/pppol2tp.h +++ b/src/include/netif/ppp/pppol2tp.h @@ -196,8 +196,5 @@ ppp_pcb *pppol2tp_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); -/* Data packet from PPP to L2TP */ -err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb); - #endif /* PPPOL2TP_H_ */ #endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */ diff --git a/src/netif/ppp/ppp.c b/src/netif/ppp/ppp.c index 61be4117..7c9a5fbd 100644 --- a/src/netif/ppp/ppp.c +++ b/src/netif/ppp/ppp.c @@ -209,14 +209,10 @@ static void ppp_free_current_input_packet(ppp_pcb_rx *pcrx); #if PPPOE_SUPPORT static void ppp_over_ethernet_open(ppp_pcb *pcb); -static err_t ppp_netif_output_over_ethernet(ppp_pcb *pcb, struct pbuf *p, u_short protocol); -static int ppp_write_over_ethernet(ppp_pcb *pcb, struct pbuf *p); #endif /* PPPOE_SUPPORT */ #if PPPOL2TP_SUPPORT static void ppp_over_l2tp_open(ppp_pcb *pcb); -static err_t ppp_netif_output_over_l2tp(ppp_pcb *pcb, struct pbuf *p, u_short protocol); -static int ppp_write_over_l2tp(ppp_pcb *pcb, struct pbuf *p); #endif /* PPPOL2TP_SUPPORT */ /***********************************/ @@ -1002,13 +998,13 @@ static err_t ppp_netif_output(struct netif *netif, struct pbuf *pb, u_short prot #if PPPOE_SUPPORT if(pcb->pppoe_sc) { - return ppp_netif_output_over_ethernet(pcb, pb, protocol); + return pcb->link_netif_output_cb(pcb->pppoe_sc, pb, protocol); } #endif /* PPPOE_SUPPORT */ #if PPPOL2TP_SUPPORT if(pcb->l2tp_pcb) { - return ppp_netif_output_over_l2tp(pcb, pb, protocol); + return pcb->link_netif_output_cb(pcb->l2tp_pcb, pb, protocol); } #endif /* PPPOL2TP_SUPPORT */ @@ -1133,97 +1129,6 @@ static err_t ppp_netif_output_over_serial(ppp_pcb *pcb, struct pbuf *pb, u_short } #endif /* PPPOS_SUPPORT */ -#if PPPOE_SUPPORT -static err_t ppp_netif_output_over_ethernet(ppp_pcb *pcb, struct pbuf *p, u_short protocol) { - struct pbuf *pb; - int i=0; -#if LWIP_SNMP - u16_t tot_len; -#endif /* LWIP_SNMP */ - err_t err; - - /* @todo: try to use pbuf_header() here! */ - pb = pbuf_alloc(PBUF_LINK, PPPOE_HEADERLEN + sizeof(protocol), PBUF_RAM); - if(!pb) { - LINK_STATS_INC(link.memerr); - LINK_STATS_INC(link.proterr); - snmp_inc_ifoutdiscards(pcb->netif); - return ERR_MEM; - } - - pbuf_header(pb, -(s16_t)PPPOE_HEADERLEN); - - pcb->last_xmit = sys_jiffies(); - - if (!pcb->pcomp || protocol > 0xFF) { - *((u_char*)pb->payload + i++) = (protocol >> 8) & 0xFF; - } - *((u_char*)pb->payload + i) = protocol & 0xFF; - - pbuf_chain(pb, p); -#if LWIP_SNMP - tot_len = pb->tot_len; -#endif /* LWIP_SNMP */ - - if( (err = pppoe_xmit(pcb->pppoe_sc, pb)) != ERR_OK) { - LINK_STATS_INC(link.err); - snmp_inc_ifoutdiscards(pcb->netif); - return err; - } - - snmp_add_ifoutoctets(pcb->netif, tot_len); - snmp_inc_ifoutucastpkts(pcb->netif); - LINK_STATS_INC(link.xmit); - return ERR_OK; -} -#endif /* PPPOE_SUPPORT */ - - -#if PPPOL2TP_SUPPORT -static err_t ppp_netif_output_over_l2tp(ppp_pcb *pcb, struct pbuf *p, u_short protocol) { - struct pbuf *pb; - int i=0; -#if LWIP_SNMP - u16_t tot_len; -#endif /* LWIP_SNMP */ - err_t err; - - /* @todo: try to use pbuf_header() here! */ - pb = pbuf_alloc(PBUF_TRANSPORT, PPPOL2TP_OUTPUT_DATA_HEADER_LEN + sizeof(protocol), PBUF_RAM); - if(!pb) { - LINK_STATS_INC(link.memerr); - LINK_STATS_INC(link.proterr); - snmp_inc_ifoutdiscards(pcb->netif); - return ERR_MEM; - } - - pbuf_header(pb, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); - - pcb->last_xmit = sys_jiffies(); - - if (!pcb->pcomp || protocol > 0xFF) { - *((u_char*)pb->payload + i++) = (protocol >> 8) & 0xFF; - } - *((u_char*)pb->payload + i) = protocol & 0xFF; - - pbuf_chain(pb, p); -#if LWIP_SNMP - tot_len = pb->tot_len; -#endif /* LWIP_SNMP */ - - if( (err = pppol2tp_xmit(pcb->l2tp_pcb, pb)) != ERR_OK) { - LINK_STATS_INC(link.err); - snmp_inc_ifoutdiscards(pcb->netif); - return err; - } - - snmp_add_ifoutoctets(pcb->netif, tot_len); - snmp_inc_ifoutucastpkts(pcb->netif); - LINK_STATS_INC(link.xmit); - return ERR_OK; -} -#endif /* PPPOL2TP_SUPPORT */ - /* Get and set parameters for the given connection. * Return 0 on success, an error code on failure. */ @@ -1293,13 +1198,13 @@ int ppp_write(ppp_pcb *pcb, struct pbuf *p) { #if PPPOE_SUPPORT if(pcb->pppoe_sc) { - return ppp_write_over_ethernet(pcb, p); + return pcb->link_write_cb(pcb->pppoe_sc, p); } #endif /* PPPOE_SUPPORT */ #if PPPOL2TP_SUPPORT if(pcb->l2tp_pcb) { - return ppp_write_over_l2tp(pcb, p); + return pcb->link_write_cb(pcb->l2tp_pcb, p); } #endif /* PPPOL2TP_SUPPORT */ @@ -1380,83 +1285,6 @@ static int ppp_write_over_serial(ppp_pcb *pcb, struct pbuf *p) { } #endif /* PPPOS_SUPPORT */ -#if PPPOE_SUPPORT -static int ppp_write_over_ethernet(ppp_pcb *pcb, struct pbuf *p) { - struct pbuf *ph; /* Ethernet + PPPoE header */ -#if LWIP_SNMP - u16_t tot_len; -#endif /* LWIP_SNMP */ - - /* skip address & flags */ - pbuf_header(p, -(s16_t)2); - - ph = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN), PBUF_RAM); - if(!ph) { - LINK_STATS_INC(link.memerr); - LINK_STATS_INC(link.proterr); - snmp_inc_ifoutdiscards(pcb->netif); - pbuf_free(p); - return PPPERR_ALLOC; - } - - pbuf_header(ph, -(s16_t)PPPOE_HEADERLEN); /* hide PPPoE header */ - pbuf_cat(ph, p); -#if LWIP_SNMP - tot_len = ph->tot_len; -#endif /* LWIP_SNMP */ - - pcb->last_xmit = sys_jiffies(); - - if(pppoe_xmit(pcb->pppoe_sc, ph) != ERR_OK) { - LINK_STATS_INC(link.err); - snmp_inc_ifoutdiscards(pcb->netif); - return PPPERR_DEVICE; - } - - snmp_add_ifoutoctets(pcb->netif, (u16_t)tot_len); - snmp_inc_ifoutucastpkts(pcb->netif); - LINK_STATS_INC(link.xmit); - return PPPERR_NONE; -} -#endif /* PPPOE_SUPPORT */ - -#if PPPOL2TP_SUPPORT -static int ppp_write_over_l2tp(ppp_pcb *pcb, struct pbuf *p) { - struct pbuf *ph; /* UDP + L2TP header */ -#if LWIP_SNMP - u16_t tot_len; -#endif /* LWIP_SNMP */ - - ph = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(PPPOL2TP_OUTPUT_DATA_HEADER_LEN), PBUF_RAM); - if(!ph) { - LINK_STATS_INC(link.memerr); - LINK_STATS_INC(link.proterr); - snmp_inc_ifoutdiscards(pcb->netif); - pbuf_free(p); - return PPPERR_ALLOC; - } - - pbuf_header(ph, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); /* hide L2TP header */ - pbuf_cat(ph, p); -#if LWIP_SNMP - tot_len = ph->tot_len; -#endif /* LWIP_SNMP */ - - pcb->last_xmit = sys_jiffies(); - - if(pppol2tp_xmit(pcb->l2tp_pcb, ph) != ERR_OK) { - LINK_STATS_INC(link.err); - snmp_inc_ifoutdiscards(pcb->netif); - return PPPERR_DEVICE; - } - - snmp_add_ifoutoctets(pcb->netif, (u16_t)tot_len); - snmp_inc_ifoutucastpkts(pcb->netif); - LINK_STATS_INC(link.xmit); - return PPPERR_NONE; -} -#endif /* PPPOL2TP_SUPPORT */ - #if PPPOS_SUPPORT /* * Drop the input packet. diff --git a/src/netif/ppp/pppoe.c b/src/netif/ppp/pppoe.c index 36f3fdfe..c8effebc 100644 --- a/src/netif/ppp/pppoe.c +++ b/src/netif/ppp/pppoe.c @@ -79,6 +79,7 @@ #include "lwip/timers.h" #include "lwip/memp.h" #include "lwip/stats.h" +#include "lwip/snmp.h" #include "netif/ppp/ppp_impl.h" #include "netif/ppp/pppoe.h" @@ -113,8 +114,10 @@ static char pppoe_error_tmp[PPPOE_ERRORSTRING_LEN]; -/* callback called from PPP core */ +/* callbacks called from PPP core */ static void pppoe_link_command_callback(void *pcb, u8_t command); +static int pppoe_link_write_callback(void *pcb, struct pbuf *p); +static err_t pppoe_link_netif_output_callback(void *pcb, struct pbuf *p, u_short protocol); /* management routines */ static err_t pppoe_destroy(struct pppoe_softc *sc); @@ -136,6 +139,7 @@ static err_t pppoe_send_pads(struct pppoe_softc *); static err_t pppoe_send_padt(struct netif *, u_int, const u8_t *); /* internal helper functions */ +static err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb); static struct pppoe_softc* pppoe_find_softc_by_session(u_int session, struct netif *rcvif); static struct pppoe_softc* pppoe_find_softc_by_hunique(u8_t *token, size_t len, struct netif *rcvif); @@ -173,7 +177,7 @@ pppoe_create(struct netif *pppif, pppoe_softc_list = sc; ppp->pppoe_sc = sc; - ppp_link_set_callbacks(ppp, pppoe_link_command_callback, NULL, NULL); + ppp_link_set_callbacks(ppp, pppoe_link_command_callback, pppoe_link_write_callback, pppoe_link_netif_output_callback); return ppp; } @@ -198,6 +202,93 @@ static void pppoe_link_command_callback(void *pcb, u8_t command) { } } +/* Called by PPP core */ +static int pppoe_link_write_callback(void *pcb, struct pbuf *p) { + struct pppoe_softc *sc = (struct pppoe_softc *)pcb; + ppp_pcb *ppp = sc->pcb; + struct pbuf *ph; /* Ethernet + PPPoE header */ +#if LWIP_SNMP + u16_t tot_len; +#endif /* LWIP_SNMP */ + + /* skip address & flags */ + pbuf_header(p, -(s16_t)2); + + ph = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN), PBUF_RAM); + if(!ph) { + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.proterr); + snmp_inc_ifoutdiscards(ppp->netif); + pbuf_free(p); + return PPPERR_ALLOC; + } + + pbuf_header(ph, -(s16_t)PPPOE_HEADERLEN); /* hide PPPoE header */ + pbuf_cat(ph, p); +#if LWIP_SNMP + tot_len = ph->tot_len; +#endif /* LWIP_SNMP */ + + ppp->last_xmit = sys_jiffies(); + + if(pppoe_xmit(sc, ph) != ERR_OK) { + LINK_STATS_INC(link.err); + snmp_inc_ifoutdiscards(ppp->netif); + return PPPERR_DEVICE; + } + + snmp_add_ifoutoctets(ppp->netif, (u16_t)tot_len); + snmp_inc_ifoutucastpkts(ppp->netif); + LINK_STATS_INC(link.xmit); + return PPPERR_NONE; +} + +/* Called by PPP core */ +static err_t pppoe_link_netif_output_callback(void *pcb, struct pbuf *p, u_short protocol) { + struct pppoe_softc *sc = (struct pppoe_softc *)pcb; + ppp_pcb *ppp = sc->pcb; + struct pbuf *pb; + int i=0; +#if LWIP_SNMP + u16_t tot_len; +#endif /* LWIP_SNMP */ + err_t err; + + /* @todo: try to use pbuf_header() here! */ + pb = pbuf_alloc(PBUF_LINK, PPPOE_HEADERLEN + sizeof(protocol), PBUF_RAM); + if(!pb) { + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.proterr); + snmp_inc_ifoutdiscards(ppp->netif); + return ERR_MEM; + } + + pbuf_header(pb, -(s16_t)PPPOE_HEADERLEN); + + ppp->last_xmit = sys_jiffies(); + + if (!ppp->pcomp || protocol > 0xFF) { + *((u_char*)pb->payload + i++) = (protocol >> 8) & 0xFF; + } + *((u_char*)pb->payload + i) = protocol & 0xFF; + + pbuf_chain(pb, p); +#if LWIP_SNMP + tot_len = pb->tot_len; +#endif /* LWIP_SNMP */ + + if( (err = pppoe_xmit(sc, pb)) != ERR_OK) { + LINK_STATS_INC(link.err); + snmp_inc_ifoutdiscards(ppp->netif); + return err; + } + + snmp_add_ifoutoctets(ppp->netif, tot_len); + snmp_inc_ifoutucastpkts(ppp->netif); + LINK_STATS_INC(link.xmit); + return ERR_OK; +} + static err_t pppoe_destroy(struct pppoe_softc *sc) { @@ -1059,7 +1150,7 @@ pppoe_send_pads(struct pppoe_softc *sc) } #endif -err_t +static err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb) { u8_t *p; diff --git a/src/netif/ppp/pppol2tp.c b/src/netif/ppp/pppol2tp.c index b33c3346..c31caa15 100644 --- a/src/netif/ppp/pppol2tp.c +++ b/src/netif/ppp/pppol2tp.c @@ -57,6 +57,7 @@ #include "lwip/memp.h" #include "lwip/netif.h" #include "lwip/udp.h" +#include "lwip/snmp.h" #include "netif/ppp/ppp_impl.h" #include "netif/ppp/pppol2tp.h" @@ -71,8 +72,12 @@ #endif #endif /* PPPOL2TP_AUTH_SUPPORT */ - /* Prototypes for procedures local to this file. */ +/* callbacks called from PPP core */ static void pppol2tp_link_command_callback(void *pcb, u8_t command); +static int pppol2tp_link_write_callback(void *pcb, struct pbuf *p); +static err_t pppol2tp_link_netif_output_callback(void *pcb, struct pbuf *p, u_short protocol); + + /* Prototypes for procedures local to this file. */ static err_t pppol2tp_destroy(pppol2tp_pcb *l2tp); /* Destroy a L2TP control block */ static err_t pppol2tp_connect(pppol2tp_pcb *l2tp); /* Be a LAC, connect to a LNS. */ static void pppol2tp_disconnect(pppol2tp_pcb *l2tp); /* Disconnect */ @@ -88,6 +93,7 @@ static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns); static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns); static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns); static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns); +static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb); /* Create a new L2TP session. */ @@ -130,7 +136,7 @@ ppp_pcb *pppol2tp_create(struct netif *pppif, #endif /* PPPOL2TP_AUTH_SUPPORT */ ppp->l2tp_pcb = l2tp; - ppp_link_set_callbacks(ppp, pppol2tp_link_command_callback, NULL, NULL); + ppp_link_set_callbacks(ppp, pppol2tp_link_command_callback, pppol2tp_link_write_callback, pppol2tp_link_netif_output_callback); return ppp; } @@ -155,6 +161,90 @@ static void pppol2tp_link_command_callback(void *pcb, u8_t command) { } } +/* Called by PPP core */ +static int pppol2tp_link_write_callback(void *pcb, struct pbuf *p) { + pppol2tp_pcb *l2tp = (pppol2tp_pcb *)pcb; + ppp_pcb *ppp = l2tp->ppp; + struct pbuf *ph; /* UDP + L2TP header */ +#if LWIP_SNMP + u16_t tot_len; +#endif /* LWIP_SNMP */ + + ph = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(PPPOL2TP_OUTPUT_DATA_HEADER_LEN), PBUF_RAM); + if(!ph) { + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.proterr); + snmp_inc_ifoutdiscards(ppp->netif); + pbuf_free(p); + return PPPERR_ALLOC; + } + + pbuf_header(ph, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); /* hide L2TP header */ + pbuf_cat(ph, p); +#if LWIP_SNMP + tot_len = ph->tot_len; +#endif /* LWIP_SNMP */ + + ppp->last_xmit = sys_jiffies(); + + if(pppol2tp_xmit(l2tp, ph) != ERR_OK) { + LINK_STATS_INC(link.err); + snmp_inc_ifoutdiscards(ppp->netif); + return PPPERR_DEVICE; + } + + snmp_add_ifoutoctets(ppp->netif, (u16_t)tot_len); + snmp_inc_ifoutucastpkts(ppp->netif); + LINK_STATS_INC(link.xmit); + return PPPERR_NONE; +} + +/* Called by PPP core */ +static err_t pppol2tp_link_netif_output_callback(void *pcb, struct pbuf *p, u_short protocol) { + pppol2tp_pcb *l2tp = (pppol2tp_pcb *)pcb; + ppp_pcb *ppp = l2tp->ppp; + struct pbuf *pb; + int i=0; +#if LWIP_SNMP + u16_t tot_len; +#endif /* LWIP_SNMP */ + err_t err; + + /* @todo: try to use pbuf_header() here! */ + pb = pbuf_alloc(PBUF_TRANSPORT, PPPOL2TP_OUTPUT_DATA_HEADER_LEN + sizeof(protocol), PBUF_RAM); + if(!pb) { + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.proterr); + snmp_inc_ifoutdiscards(ppp->netif); + return ERR_MEM; + } + + pbuf_header(pb, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); + + ppp->last_xmit = sys_jiffies(); + + if (!ppp->pcomp || protocol > 0xFF) { + *((u_char*)pb->payload + i++) = (protocol >> 8) & 0xFF; + } + *((u_char*)pb->payload + i) = protocol & 0xFF; + + pbuf_chain(pb, p); +#if LWIP_SNMP + tot_len = pb->tot_len; +#endif /* LWIP_SNMP */ + + if( (err = pppol2tp_xmit(l2tp, pb)) != ERR_OK) { + LINK_STATS_INC(link.err); + snmp_inc_ifoutdiscards(ppp->netif); + return err; + } + + snmp_add_ifoutoctets(ppp->netif, tot_len); + snmp_inc_ifoutucastpkts(ppp->netif); + LINK_STATS_INC(link.xmit); + return ERR_OK; +} + /* Destroy a L2TP control block */ static err_t pppol2tp_destroy(pppol2tp_pcb *l2tp) { @@ -1012,7 +1102,7 @@ static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns) { return ERR_OK; } -err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb) { +static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb) { u8_t *p; /* are we ready to process data yet? */