mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2025-03-15 13:20:57 +00:00
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:
parent
45bfccfddc
commit
0afc34f6fc
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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? */
|
||||
|
Loading…
x
Reference in New Issue
Block a user