54 #if PPP_SUPPORT && PPPOL2TP_SUPPORT 69 #if PPPOL2TP_AUTH_SUPPORT 70 #if LWIP_INCLUDED_POLARSSL_MD5 78 static err_t pppol2tp_write(ppp_pcb *ppp,
void *ctx,
struct pbuf *p);
79 static err_t pppol2tp_netif_output(ppp_pcb *ppp,
void *ctx,
struct pbuf *p, u_short protocol);
80 static err_t pppol2tp_destroy(ppp_pcb *ppp,
void *ctx);
81 static err_t pppol2tp_connect(ppp_pcb *ppp,
void *ctx);
82 static void pppol2tp_disconnect(ppp_pcb *ppp,
void *ctx);
85 static void pppol2tp_input(
void *arg,
struct udp_pcb *pcb,
struct pbuf *p,
const ip_addr_t *addr,
u16_t port);
86 static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp,
u16_t port,
struct pbuf *p,
u16_t ns,
u16_t nr);
87 static void pppol2tp_timeout(
void *arg);
88 static void pppol2tp_abort_connect(pppol2tp_pcb *l2tp);
89 static void pppol2tp_clear(pppol2tp_pcb *l2tp);
90 static err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp);
91 static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp,
u16_t ns);
92 static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp,
u16_t ns);
93 static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp,
u16_t ns);
94 static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp,
u16_t ns);
95 static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp,
u16_t ns);
96 static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp,
struct pbuf *pb);
97 static err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp,
struct pbuf *pb);
100 static const struct link_callbacks pppol2tp_callbacks = {
108 pppol2tp_netif_output,
115 ppp_pcb *pppol2tp_create(
struct netif *pppif,
117 const u8_t *secret,
u8_t secret_len,
118 ppp_link_status_cb_fn link_status_cb,
void *ctx_cb) {
123 if (ipaddr ==
NULL) {
124 goto ipaddr_check_failed;
127 l2tp = (pppol2tp_pcb *)
memp_malloc(MEMP_PPPOL2TP_PCB);
129 goto memp_malloc_l2tp_failed;
141 udp_recv(udp, pppol2tp_input, l2tp);
143 ppp = ppp_new(pppif, &pppol2tp_callbacks, l2tp, link_status_cb, ctx_cb);
148 memset(l2tp, 0,
sizeof(pppol2tp_pcb));
149 l2tp->phase = PPPOL2TP_STATE_INITIAL;
154 l2tp->remote_port = port;
155 #if PPPOL2TP_AUTH_SUPPORT 156 l2tp->secret = secret;
157 l2tp->secret_len = secret_len;
166 memp_malloc_l2tp_failed:
172 static err_t pppol2tp_write(ppp_pcb *ppp,
void *ctx,
struct pbuf *p) {
173 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
197 ret = pppol2tp_xmit(l2tp, ph);
211 static err_t pppol2tp_netif_output(ppp_pcb *ppp,
void *ctx,
struct pbuf *p, u_short protocol) {
212 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
234 PUTSHORT(protocol, pl);
241 if( (err = pppol2tp_xmit(l2tp, pb)) !=
ERR_OK) {
254 static err_t pppol2tp_destroy(ppp_pcb *ppp,
void *ctx) {
255 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
259 if (l2tp->udp !=
NULL) {
260 udp_remove(l2tp->udp);
267 static err_t pppol2tp_connect(ppp_pcb *ppp,
void *ctx) {
269 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
272 #if PPP_IPV4_SUPPORT && VJ_SUPPORT 273 ipcp_options *ipcp_wo;
274 ipcp_options *ipcp_ao;
277 if (l2tp->phase != PPPOL2TP_STATE_INITIAL) {
281 pppol2tp_clear(l2tp);
285 lcp_wo = &ppp->lcp_wantoptions;
286 lcp_wo->mru = PPPOL2TP_DEFMRU;
287 lcp_wo->neg_asyncmap = 0;
288 lcp_wo->neg_pcompression = 0;
289 lcp_wo->neg_accompression = 0;
291 lcp_ao = &ppp->lcp_allowoptions;
292 lcp_ao->mru = PPPOL2TP_DEFMRU;
293 lcp_ao->neg_asyncmap = 0;
294 lcp_ao->neg_pcompression = 0;
295 lcp_ao->neg_accompression = 0;
297 #if PPP_IPV4_SUPPORT && VJ_SUPPORT 298 ipcp_wo = &ppp->ipcp_wantoptions;
302 ipcp_ao = &ppp->ipcp_allowoptions;
312 udp_bind(l2tp->udp, IP6_ADDR_ANY, 0);
315 udp_bind(l2tp->udp, IP_ADDR_ANY, 0);
317 #if PPPOL2TP_AUTH_SUPPORT 319 if (l2tp->secret !=
NULL) {
320 magic_random_bytes(l2tp->secret_rv,
sizeof(l2tp->secret_rv));
325 l2tp->remote_tunnel_id = magic();
326 }
while(l2tp->remote_tunnel_id == 0);
328 l2tp->sccrq_retried = 0;
329 l2tp->phase = PPPOL2TP_STATE_SCCRQ_SENT;
330 if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {
331 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: failed to send SCCRQ, error=%d\n", err));
333 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
338 static void pppol2tp_disconnect(ppp_pcb *ppp,
void *ctx) {
339 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
341 if (l2tp->phase < PPPOL2TP_STATE_DATA) {
346 pppol2tp_send_stopccn(l2tp, l2tp->our_ns);
348 pppol2tp_clear(l2tp);
353 static void pppol2tp_input(
void *arg,
struct udp_pcb *pcb,
struct pbuf *p,
const ip_addr_t *addr,
u16_t port) {
354 pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;
355 u16_t hflags, hlen,
len=0, tunnel_id=0, session_id=0, ns=0, nr=0, offset=0;
359 if (l2tp->phase < PPPOL2TP_STATE_SCCRQ_SENT) {
360 goto free_and_return;
364 goto free_and_return;
368 if (l2tp->phase > PPPOL2TP_STATE_SCCRQ_SENT && l2tp->tunnel_port != port) {
369 goto free_and_return;
375 if (p->
len <
sizeof(hflags) +
sizeof(tunnel_id) +
sizeof(session_id) ) {
376 goto packet_too_short;
380 GETSHORT(hflags, inp);
382 if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {
384 if ( (hflags & PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY) != PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY ) {
385 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: mandatory header flags for control packet not set\n"));
386 goto free_and_return;
389 if (hflags & PPPOL2TP_HEADERFLAG_CONTROL_FORBIDDEN) {
390 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: forbidden header flags for control packet found\n"));
391 goto free_and_return;
395 if ( (hflags & PPPOL2TP_HEADERFLAG_DATA_MANDATORY) != PPPOL2TP_HEADERFLAG_DATA_MANDATORY) {
396 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: mandatory header flags for data packet not set\n"));
397 goto free_and_return;
402 hlen =
sizeof(hflags) +
sizeof(tunnel_id) +
sizeof(session_id);
403 if (hflags & PPPOL2TP_HEADERFLAG_LENGTH) {
406 if (hflags & PPPOL2TP_HEADERFLAG_SEQUENCE) {
407 hlen +=
sizeof(ns) +
sizeof(nr);
409 if (hflags & PPPOL2TP_HEADERFLAG_OFFSET) {
410 hlen +=
sizeof(offset);
413 goto packet_too_short;
416 if (hflags & PPPOL2TP_HEADERFLAG_LENGTH) {
418 if (p->
len < len || len < hlen) {
419 goto packet_too_short;
422 GETSHORT(tunnel_id, inp);
423 GETSHORT(session_id, inp);
424 if (hflags & PPPOL2TP_HEADERFLAG_SEQUENCE) {
428 if (hflags & PPPOL2TP_HEADERFLAG_OFFSET) {
429 GETSHORT(offset, inp)
431 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: strange packet received, offset=%d\n", offset));
432 goto free_and_return;
436 goto packet_too_short;
445 goto free_and_return;
449 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: input packet, len=%"U16_F", tunnel=%"U16_F", session=%"U16_F", ns=%"U16_F", nr=%"U16_F"\n",
450 len, tunnel_id, session_id, ns, nr));
453 if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {
454 pppol2tp_dispatch_control_packet(l2tp, port, p, ns, nr);
455 goto free_and_return;
459 if(l2tp->phase != PPPOL2TP_STATE_DATA) {
460 goto free_and_return;
462 if(tunnel_id != l2tp->remote_tunnel_id) {
463 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: tunnel ID mismatch, assigned=%d, received=%d\n", l2tp->remote_tunnel_id, tunnel_id));
464 goto free_and_return;
466 if(session_id != l2tp->remote_session_id) {
467 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: session ID mismatch, assigned=%d, received=%d\n", l2tp->remote_session_id, session_id));
468 goto free_and_return;
477 GETSHORT(hflags, inp);
478 if (hflags == 0xff03) {
483 ppp_input(l2tp->ppp, p);
487 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: packet too short: %d\n", p->
len));
493 static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp,
u16_t port,
struct pbuf *p,
u16_t ns,
u16_t nr) {
495 u16_t avplen, avpflags, vendorid, attributetype, messagetype=0;
497 #if PPPOL2TP_AUTH_SUPPORT 500 u8_t challenge_id = 0;
508 if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && l2tp->peer_nr > l2tp->our_ns) {
509 l2tp->phase = PPPOL2TP_STATE_DATA;
517 p = ppp_singlebuf(p);
521 if (p->
len <
sizeof(avpflags) +
sizeof(vendorid) +
sizeof(attributetype) ) {
522 goto packet_too_short;
524 GETSHORT(avpflags, inp);
525 avplen = avpflags & PPPOL2TP_AVPHEADERFLAG_LENGTHMASK;
527 if (p->
len < avplen || avplen <
sizeof(avpflags) +
sizeof(vendorid) +
sizeof(attributetype)) {
528 goto packet_too_short;
530 GETSHORT(vendorid, inp);
531 GETSHORT(attributetype, inp);
532 avplen -=
sizeof(avpflags) +
sizeof(vendorid) +
sizeof(attributetype);
535 if (messagetype == 0) {
536 if (attributetype != 0 || vendorid != 0 || avplen !=
sizeof(messagetype) ) {
537 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: message type must be the first AVP\n"));
540 GETSHORT(messagetype, inp);
542 switch(messagetype) {
544 case PPPOL2TP_MESSAGETYPE_SCCRP:
546 if (l2tp->phase != PPPOL2TP_STATE_SCCRQ_SENT) {
551 case PPPOL2TP_MESSAGETYPE_ICRP:
553 if (l2tp->phase != PPPOL2TP_STATE_ICRQ_SENT) {
558 case PPPOL2TP_MESSAGETYPE_STOPCCN:
559 pppol2tp_send_zlb(l2tp, l2tp->our_ns);
560 if (l2tp->phase < PPPOL2TP_STATE_DATA) {
561 pppol2tp_abort_connect(l2tp);
562 }
else if (l2tp->phase == PPPOL2TP_STATE_DATA) {
581 switch (messagetype) {
583 case PPPOL2TP_MESSAGETYPE_SCCRP:
584 switch (attributetype) {
585 case PPPOL2TP_AVPTYPE_TUNNELID:
586 if (avplen !=
sizeof(l2tp->source_tunnel_id) ) {
587 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: AVP Assign tunnel ID length check failed\n"));
590 GETSHORT(l2tp->source_tunnel_id, inp);
591 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: Assigned tunnel ID %"U16_F"\n", l2tp->source_tunnel_id));
593 #if PPPOL2TP_AUTH_SUPPORT 594 case PPPOL2TP_AVPTYPE_CHALLENGE:
596 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: Challenge length check failed\n"));
599 if (l2tp->secret ==
NULL) {
600 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: Received challenge from peer and no secret key available\n"));
601 pppol2tp_abort_connect(l2tp);
605 md5_starts(&md5_ctx);
606 challenge_id = PPPOL2TP_MESSAGETYPE_SCCCN;
607 md5_update(&md5_ctx, &challenge_id, 1);
608 md5_update(&md5_ctx, l2tp->secret, l2tp->secret_len);
609 md5_update(&md5_ctx, inp, avplen);
610 md5_finish(&md5_ctx, l2tp->challenge_hash);
611 l2tp->send_challenge = 1;
613 case PPPOL2TP_AVPTYPE_CHALLENGERESPONSE:
614 if (avplen != PPPOL2TP_AVPTYPE_CHALLENGERESPONSE_SIZE) {
615 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: AVP Challenge Response length check failed\n"));
619 md5_starts(&md5_ctx);
620 challenge_id = PPPOL2TP_MESSAGETYPE_SCCRP;
621 md5_update(&md5_ctx, &challenge_id, 1);
622 md5_update(&md5_ctx, l2tp->secret, l2tp->secret_len);
623 md5_update(&md5_ctx, l2tp->secret_rv,
sizeof(l2tp->secret_rv));
624 md5_finish(&md5_ctx, md5_hash);
625 if ( memcmp(inp, md5_hash,
sizeof(md5_hash)) ) {
626 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: Received challenge response from peer and secret key do not match\n"));
627 pppol2tp_abort_connect(l2tp);
637 case PPPOL2TP_MESSAGETYPE_ICRP:
638 switch (attributetype) {
639 case PPPOL2TP_AVPTYPE_SESSIONID:
640 if (avplen !=
sizeof(l2tp->source_session_id) ) {
641 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: AVP Assign session ID length check failed\n"));
644 GETSHORT(l2tp->source_session_id, inp);
645 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: Assigned session ID %"U16_F"\n", l2tp->source_session_id));
660 if (
pbuf_header(p, -(
s16_t)(avplen +
sizeof(avpflags) +
sizeof(vendorid) +
sizeof(attributetype)) ) != 0) {
665 switch(messagetype) {
667 case PPPOL2TP_MESSAGETYPE_SCCRP:
669 l2tp->remote_session_id = magic();
670 }
while(l2tp->remote_session_id == 0);
671 l2tp->tunnel_port = port;
672 l2tp->icrq_retried = 0;
673 l2tp->phase = PPPOL2TP_STATE_ICRQ_SENT;
675 if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns)) != 0) {
676 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: failed to send SCCCN, error=%d\n", err));
679 if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
680 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: failed to send ICRQ, error=%d\n", err));
683 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
686 case PPPOL2TP_MESSAGETYPE_ICRP:
687 l2tp->iccn_retried = 0;
688 l2tp->phase = PPPOL2TP_STATE_ICCN_SENT;
690 ppp_start(l2tp->ppp);
691 if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
692 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: failed to send ICCN, error=%d\n", err));
695 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
704 pppol2tp_send_zlb(l2tp, l2tp->our_ns);
707 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: packet too short: %d\n", p->
len));
711 static void pppol2tp_timeout(
void *arg) {
712 pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;
716 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: timeout\n"));
718 switch (l2tp->phase) {
719 case PPPOL2TP_STATE_SCCRQ_SENT:
721 if (l2tp->sccrq_retried < 0xff) {
722 l2tp->sccrq_retried++;
724 if (!l2tp->ppp->settings.persist && l2tp->sccrq_retried >= PPPOL2TP_MAXSCCRQ) {
725 pppol2tp_abort_connect(l2tp);
728 retry_wait =
LWIP_MIN(PPPOL2TP_CONTROL_TIMEOUT * l2tp->sccrq_retried, PPPOL2TP_SLOW_RETRY);
729 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: sccrq_retried=%d\n", l2tp->sccrq_retried));
730 if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {
731 l2tp->sccrq_retried--;
732 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: failed to send SCCRQ, error=%d\n", err));
737 case PPPOL2TP_STATE_ICRQ_SENT:
738 l2tp->icrq_retried++;
739 if (l2tp->icrq_retried >= PPPOL2TP_MAXICRQ) {
740 pppol2tp_abort_connect(l2tp);
743 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: icrq_retried=%d\n", l2tp->icrq_retried));
744 if (l2tp->peer_nr <= l2tp->our_ns -1) {
745 if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns -1)) != 0) {
746 l2tp->icrq_retried--;
747 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: failed to send SCCCN, error=%d\n", err));
748 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
752 if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
753 l2tp->icrq_retried--;
754 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: failed to send ICRQ, error=%d\n", err));
756 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
759 case PPPOL2TP_STATE_ICCN_SENT:
760 l2tp->iccn_retried++;
761 if (l2tp->iccn_retried >= PPPOL2TP_MAXICCN) {
762 pppol2tp_abort_connect(l2tp);
765 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried));
766 if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
767 l2tp->iccn_retried--;
768 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: failed to send ICCN, error=%d\n", err));
770 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
779 static void pppol2tp_abort_connect(pppol2tp_pcb *l2tp) {
780 PPPDEBUG(LOG_DEBUG, (
"pppol2tp: could not establish connection\n"));
781 pppol2tp_clear(l2tp);
782 ppp_link_failed(l2tp->ppp);
786 static void pppol2tp_clear(pppol2tp_pcb *l2tp) {
789 l2tp->phase = PPPOL2TP_STATE_INITIAL;
790 l2tp->tunnel_port = l2tp->remote_port;
794 l2tp->source_tunnel_id = 0;
795 l2tp->remote_tunnel_id = 0;
796 l2tp->source_session_id = 0;
797 l2tp->remote_session_id = 0;
802 static err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp) {
808 len = 12 +8 +8 +10 +10 +6+
sizeof(PPPOL2TP_HOSTNAME)-1 +6+
sizeof(PPPOL2TP_VENDORNAME)-1 +8 +8;
809 #if PPPOL2TP_AUTH_SUPPORT 810 if (l2tp->secret !=
NULL) {
811 len += 6 +
sizeof(l2tp->secret_rv);
825 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
833 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
835 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p);
836 PUTSHORT(PPPOL2TP_MESSAGETYPE_SCCRQ, p);
839 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
841 PUTSHORT(PPPOL2TP_AVPTYPE_VERSION, p);
842 PUTSHORT(PPPOL2TP_VERSION, p);
845 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p);
847 PUTSHORT(PPPOL2TP_AVPTYPE_FRAMINGCAPABILITIES, p);
848 PUTLONG(PPPOL2TP_FRAMINGCAPABILITIES, p);
851 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p);
853 PUTSHORT(PPPOL2TP_AVPTYPE_BEARERCAPABILITIES, p);
854 PUTLONG(PPPOL2TP_BEARERCAPABILITIES, p);
857 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6+
sizeof(PPPOL2TP_HOSTNAME)-1, p);
859 PUTSHORT(PPPOL2TP_AVPTYPE_HOSTNAME, p);
860 MEMCPY(p, PPPOL2TP_HOSTNAME,
sizeof(PPPOL2TP_HOSTNAME)-1);
861 INCPTR(
sizeof(PPPOL2TP_HOSTNAME)-1, p);
864 PUTSHORT(6+
sizeof(PPPOL2TP_VENDORNAME)-1, p);
866 PUTSHORT(PPPOL2TP_AVPTYPE_VENDORNAME, p);
867 MEMCPY(p, PPPOL2TP_VENDORNAME,
sizeof(PPPOL2TP_VENDORNAME)-1);
868 INCPTR(
sizeof(PPPOL2TP_VENDORNAME)-1, p);
871 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
873 PUTSHORT(PPPOL2TP_AVPTYPE_TUNNELID, p);
874 PUTSHORT(l2tp->remote_tunnel_id, p);
877 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
879 PUTSHORT(PPPOL2TP_AVPTYPE_RECEIVEWINDOWSIZE, p);
880 PUTSHORT(PPPOL2TP_RECEIVEWINDOWSIZE, p);
882 #if PPPOL2TP_AUTH_SUPPORT 884 if (l2tp->secret !=
NULL) {
885 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 +
sizeof(l2tp->secret_rv), p);
887 PUTSHORT(PPPOL2TP_AVPTYPE_CHALLENGE, p);
888 MEMCPY(p, l2tp->secret_rv,
sizeof(l2tp->secret_rv));
889 INCPTR(
sizeof(l2tp->secret_rv), p);
893 return pppol2tp_udp_send(l2tp, pb);
897 static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp,
u16_t ns) {
904 #if PPPOL2TP_AUTH_SUPPORT 905 if (l2tp->send_challenge) {
906 len += 6 +
sizeof(l2tp->challenge_hash);
920 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
922 PUTSHORT(l2tp->source_tunnel_id, p);
925 PUTSHORT(l2tp->peer_ns+1, p);
928 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
930 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p);
931 PUTSHORT(PPPOL2TP_MESSAGETYPE_SCCCN, p);
933 #if PPPOL2TP_AUTH_SUPPORT 935 if (l2tp->send_challenge) {
936 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 +
sizeof(l2tp->challenge_hash), p);
938 PUTSHORT(PPPOL2TP_AVPTYPE_CHALLENGERESPONSE, p);
939 MEMCPY(p, l2tp->challenge_hash,
sizeof(l2tp->challenge_hash));
940 INCPTR(
sizeof(l2tp->challenge_hash), p);
944 return pppol2tp_udp_send(l2tp, pb);
948 static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp,
u16_t ns) {
967 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
969 PUTSHORT(l2tp->source_tunnel_id, p);
972 PUTSHORT(l2tp->peer_ns+1, p);
975 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
977 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p);
978 PUTSHORT(PPPOL2TP_MESSAGETYPE_ICRQ, p);
981 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
983 PUTSHORT(PPPOL2TP_AVPTYPE_SESSIONID, p);
984 PUTSHORT(l2tp->remote_session_id, p);
987 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p);
989 PUTSHORT(PPPOL2TP_AVPTYPE_CALLSERIALNUMBER, p);
990 serialnumber = magic();
991 PUTLONG(serialnumber, p);
993 return pppol2tp_udp_send(l2tp, pb);
997 static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp,
u16_t ns) {
1003 len = 12 +8 +10 +10;
1015 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
1017 PUTSHORT(l2tp->source_tunnel_id, p);
1018 PUTSHORT(l2tp->source_session_id, p);
1020 PUTSHORT(l2tp->peer_ns+1, p);
1023 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
1025 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p);
1026 PUTSHORT(PPPOL2TP_MESSAGETYPE_ICCN, p);
1029 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p);
1031 PUTSHORT(PPPOL2TP_AVPTYPE_FRAMINGTYPE, p);
1032 PUTLONG(PPPOL2TP_FRAMINGTYPE, p);
1035 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p);
1037 PUTSHORT(PPPOL2TP_AVPTYPE_TXCONNECTSPEED, p);
1038 PUTLONG(PPPOL2TP_TXCONNECTSPEED, p);
1040 return pppol2tp_udp_send(l2tp, pb);
1044 static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp,
u16_t ns) {
1062 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
1064 PUTSHORT(l2tp->source_tunnel_id, p);
1067 PUTSHORT(l2tp->peer_ns+1, p);
1069 return pppol2tp_udp_send(l2tp, pb);
1073 static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp,
u16_t ns) {
1091 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
1093 PUTSHORT(l2tp->source_tunnel_id, p);
1096 PUTSHORT(l2tp->peer_ns+1, p);
1099 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
1101 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p);
1102 PUTSHORT(PPPOL2TP_MESSAGETYPE_STOPCCN, p);
1105 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
1107 PUTSHORT(PPPOL2TP_AVPTYPE_TUNNELID, p);
1108 PUTSHORT(l2tp->remote_tunnel_id, p);
1111 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p);
1113 PUTSHORT(PPPOL2TP_AVPTYPE_RESULTCODE, p);
1114 PUTSHORT(PPPOL2TP_RESULTCODE, p);
1116 return pppol2tp_udp_send(l2tp, pb);
1119 static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp,
struct pbuf *pb) {
1123 if (l2tp->phase < PPPOL2TP_STATE_DATA) {
1131 PPPDEBUG(LOG_ERR, (
"pppol2tp: pppol2tp_pcb: could not allocate room for L2TP header\n"));
1138 PUTSHORT(PPPOL2TP_HEADERFLAG_DATA_MANDATORY, p);
1139 PUTSHORT(l2tp->source_tunnel_id, p);
1140 PUTSHORT(l2tp->source_session_id, p);
1142 return pppol2tp_udp_send(l2tp, pb);
1145 static err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp,
struct pbuf *pb) {
1148 err = udp_sendto_if(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port, l2tp->netif);
1150 err = udp_sendto(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port);
u8_t pbuf_header(struct pbuf *p, s16_t header_size_increment)
#define MEMCPY(dst, src, len)
void memp_free(memp_t type, void *mem)
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
#define MIB2_STATS_NETIF_ADD(n, x, val)
u8_t pbuf_free(struct pbuf *p)
#define ip_addr_copy(dest, src)
void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)
void pbuf_chain(struct pbuf *h, struct pbuf *t)
#define IP_IS_V6_VAL(ipaddr)
#define LINK_STATS_INC(x)
#define ip_addr_cmp(addr1, addr2)
#define LWIP_ASSERT(message, assertion)
void pbuf_cat(struct pbuf *h, struct pbuf *t)
#define MIB2_STATS_NETIF_INC(n, x)
void * memp_malloc(memp_t type)
#define LWIP_UNUSED_ARG(x)
void sys_untimeout(sys_timeout_handler handler, void *arg)