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
This commit is contained in:
Sylvain Rochet 2015-02-15 11:04:09 +01:00
parent 45bfccfddc
commit 0afc34f6fc
6 changed files with 193 additions and 189 deletions

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -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.

View File

@ -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;

View File

@ -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? */