54#if PPP_SUPPORT && PPPOL2TP_SUPPORT
70LWIP_MEMPOOL_DECLARE(PPPOL2TP_PCB, MEMP_NUM_PPPOL2TP_INTERFACES,
sizeof(pppol2tp_pcb),
"PPPOL2TP_PCB")
75static
err_t pppol2tp_destroy(ppp_pcb *ppp,
void *
ctx);
76static
void pppol2tp_connect(ppp_pcb *ppp,
void *
ctx);
77static
void pppol2tp_disconnect(ppp_pcb *ppp,
void *
ctx);
82static
void pppol2tp_timeout(
void *
arg);
83static
void pppol2tp_abort_connect(pppol2tp_pcb *l2tp);
84static
err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp);
85static
err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp,
u16_t ns);
86static
err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp,
u16_t ns);
87static
err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp,
u16_t ns);
89static
err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp,
u16_t ns);
94static
const struct link_callbacks pppol2tp_callbacks = {
102 pppol2tp_netif_output,
109ppp_pcb *pppol2tp_create(
struct netif *pppif,
112 ppp_link_status_cb_fn link_status_cb,
void *ctx_cb) {
116#if !PPPOL2TP_AUTH_SUPPORT
121 if (ipaddr ==
NULL) {
122 goto ipaddr_check_failed;
127 goto memp_malloc_l2tp_failed;
134 udp_recv(udp, pppol2tp_input, l2tp);
136 ppp = ppp_new(pppif, &pppol2tp_callbacks, l2tp, link_status_cb, ctx_cb);
141 memset(l2tp, 0,
sizeof(pppol2tp_pcb));
142 l2tp->phase = PPPOL2TP_STATE_INITIAL;
147 l2tp->remote_port =
port;
148#if PPPOL2TP_AUTH_SUPPORT
150 l2tp->secret_len = secret_len;
159memp_malloc_l2tp_failed:
165static err_t pppol2tp_write(ppp_pcb *ppp,
void *
ctx,
struct pbuf *
p) {
166 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)
ctx;
193 ret = pppol2tp_xmit(l2tp, ph);
208 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)
ctx;
237 if( (
err = pppol2tp_xmit(l2tp, pb)) !=
ERR_OK) {
250static err_t pppol2tp_destroy(ppp_pcb *ppp,
void *
ctx) {
251 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)
ctx;
254 sys_untimeout(pppol2tp_timeout, l2tp);
255 udp_remove(l2tp->udp);
261static void pppol2tp_connect(ppp_pcb *ppp,
void *
ctx) {
263 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)
ctx;
266#if PPP_IPV4_SUPPORT && VJ_SUPPORT
267 ipcp_options *ipcp_wo;
268 ipcp_options *ipcp_ao;
271 l2tp->tunnel_port = l2tp->remote_port;
275 l2tp->source_tunnel_id = 0;
276 l2tp->remote_tunnel_id = 0;
277 l2tp->source_session_id = 0;
278 l2tp->remote_session_id = 0;
281 lcp_wo = &ppp->lcp_wantoptions;
282 lcp_wo->mru = PPPOL2TP_DEFMRU;
283 lcp_wo->neg_asyncmap = 0;
284 lcp_wo->neg_pcompression = 0;
285 lcp_wo->neg_accompression = 0;
289 lcp_ao = &ppp->lcp_allowoptions;
290 lcp_ao->mru = PPPOL2TP_DEFMRU;
291 lcp_ao->neg_asyncmap = 0;
292 lcp_ao->neg_pcompression = 0;
293 lcp_ao->neg_accompression = 0;
295#if PPP_IPV4_SUPPORT && VJ_SUPPORT
296 ipcp_wo = &ppp->ipcp_wantoptions;
300 ipcp_ao = &ppp->ipcp_allowoptions;
310 udp_bind(l2tp->udp, IP6_ADDR_ANY, 0);
313 udp_bind(l2tp->udp, IP_ADDR_ANY, 0);
315#if PPPOL2TP_AUTH_SUPPORT
317 if (l2tp->secret !=
NULL) {
318 magic_random_bytes(l2tp->secret_rv,
sizeof(l2tp->secret_rv));
323 l2tp->remote_tunnel_id = magic();
324 }
while(l2tp->remote_tunnel_id == 0);
326 l2tp->sccrq_retried = 0;
327 l2tp->phase = PPPOL2TP_STATE_SCCRQ_SENT;
328 if ((
err = pppol2tp_send_sccrq(l2tp)) != 0) {
329 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: failed to send SCCRQ, error=%d\n",
err));
331 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
335static void pppol2tp_disconnect(ppp_pcb *ppp,
void *
ctx) {
336 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)
ctx;
339 pppol2tp_send_stopccn(l2tp, l2tp->our_ns);
342 sys_untimeout(pppol2tp_timeout, l2tp);
343 l2tp->phase = PPPOL2TP_STATE_INITIAL;
349 pppol2tp_pcb *l2tp = (pppol2tp_pcb*)
arg;
355 if (l2tp->phase < PPPOL2TP_STATE_SCCRQ_SENT) {
356 goto free_and_return;
360 goto free_and_return;
364 if (l2tp->phase > PPPOL2TP_STATE_SCCRQ_SENT && l2tp->tunnel_port !=
port) {
365 goto free_and_return;
371 if (
p->len <
sizeof(hflags) +
sizeof(tunnel_id) +
sizeof(session_id) ) {
372 goto packet_too_short;
375 inp = (
u8_t*)
p->payload;
376 GETSHORT(hflags, inp);
378 if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {
380 if ( (hflags & PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY) != PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY ) {
381 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: mandatory header flags for control packet not set\n"));
382 goto free_and_return;
385 if (hflags & PPPOL2TP_HEADERFLAG_CONTROL_FORBIDDEN) {
386 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: forbidden header flags for control packet found\n"));
387 goto free_and_return;
391 if ( (hflags & PPPOL2TP_HEADERFLAG_DATA_MANDATORY) != PPPOL2TP_HEADERFLAG_DATA_MANDATORY) {
392 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: mandatory header flags for data packet not set\n"));
393 goto free_and_return;
398 hlen =
sizeof(hflags) +
sizeof(tunnel_id) +
sizeof(session_id);
399 if (hflags & PPPOL2TP_HEADERFLAG_LENGTH) {
402 if (hflags & PPPOL2TP_HEADERFLAG_SEQUENCE) {
403 hlen +=
sizeof(
ns) +
sizeof(
nr);
405 if (hflags & PPPOL2TP_HEADERFLAG_OFFSET) {
409 goto packet_too_short;
412 if (hflags & PPPOL2TP_HEADERFLAG_LENGTH) {
414 if (
p->len <
len ||
len < hlen) {
415 goto packet_too_short;
418 GETSHORT(tunnel_id, inp);
419 GETSHORT(session_id, inp);
420 if (hflags & PPPOL2TP_HEADERFLAG_SEQUENCE) {
424 if (hflags & PPPOL2TP_HEADERFLAG_OFFSET) {
427 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: strange packet received, offset=%d\n",
offset));
428 goto free_and_return;
432 goto packet_too_short;
441 goto free_and_return;
446 p->tot_len, tunnel_id, session_id,
ns,
nr));
449 if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {
450 pppol2tp_dispatch_control_packet(l2tp,
port,
p,
ns,
nr);
451 goto free_and_return;
455 if(l2tp->phase != PPPOL2TP_STATE_DATA) {
456 goto free_and_return;
458 if(tunnel_id != l2tp->remote_tunnel_id) {
459 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: tunnel ID mismatch, assigned=%d, received=%d\n", l2tp->remote_tunnel_id, tunnel_id));
460 goto free_and_return;
462 if(session_id != l2tp->remote_session_id) {
463 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: session ID mismatch, assigned=%d, received=%d\n", l2tp->remote_session_id, session_id));
464 goto free_and_return;
481 GETSHORT(hflags, inp);
482 if (hflags == 0xff03) {
487 ppp_input(l2tp->ppp,
p);
491 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: packet too short: %d\n",
p->len));
499 u16_t avplen, avpflags, vendorid, attributetype, messagetype=0;
501#if PPPOL2TP_AUTH_SUPPORT
504 u8_t challenge_id = 0;
510 if (
ns != l2tp->peer_ns) {
511 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: drop unexpected packet: received NS=%d, expected NS=%d\n",
ns, l2tp->peer_ns));
521 if ((
s16_t)(
ns - l2tp->peer_ns) < 0) {
522 pppol2tp_send_zlb(l2tp,
nr,
ns+1);
530 if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && (
s16_t)(l2tp->peer_nr - l2tp->our_ns) > 0) {
531 l2tp->phase = PPPOL2TP_STATE_DATA;
532 sys_untimeout(pppol2tp_timeout, l2tp);
533 ppp_start(l2tp->ppp);
537 if (
p->tot_len == 0) {
541 l2tp->peer_ns =
ns+1;
544 if (
p->next !=
NULL) {
545 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: pbuf_coalesce failed: %d\n",
p->tot_len));
549 inp = (
u8_t*)
p->payload;
552 if (
p->len <
sizeof(avpflags) +
sizeof(vendorid) +
sizeof(attributetype) ) {
553 goto packet_too_short;
555 GETSHORT(avpflags, inp);
556 avplen = avpflags & PPPOL2TP_AVPHEADERFLAG_LENGTHMASK;
558 if (
p->len < avplen || avplen <
sizeof(avpflags) +
sizeof(vendorid) +
sizeof(attributetype)) {
559 goto packet_too_short;
561 GETSHORT(vendorid, inp);
562 GETSHORT(attributetype, inp);
563 avplen -=
sizeof(avpflags) +
sizeof(vendorid) +
sizeof(attributetype);
566 if (messagetype == 0) {
567 if (attributetype != 0 || vendorid != 0 || avplen !=
sizeof(messagetype) ) {
568 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: message type must be the first AVP\n"));
571 GETSHORT(messagetype, inp);
573 switch(messagetype) {
575 case PPPOL2TP_MESSAGETYPE_SCCRP:
577 if (l2tp->phase != PPPOL2TP_STATE_SCCRQ_SENT) {
582 case PPPOL2TP_MESSAGETYPE_ICRP:
584 if (l2tp->phase != PPPOL2TP_STATE_ICRQ_SENT) {
589 case PPPOL2TP_MESSAGETYPE_STOPCCN:
590 pppol2tp_send_zlb(l2tp, l2tp->our_ns+1, l2tp->peer_ns);
591 if (l2tp->phase < PPPOL2TP_STATE_DATA) {
592 pppol2tp_abort_connect(l2tp);
593 }
else if (l2tp->phase == PPPOL2TP_STATE_DATA) {
612 switch (messagetype) {
614 case PPPOL2TP_MESSAGETYPE_SCCRP:
615 switch (attributetype) {
616 case PPPOL2TP_AVPTYPE_TUNNELID:
617 if (avplen !=
sizeof(l2tp->source_tunnel_id) ) {
618 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: AVP Assign tunnel ID length check failed\n"));
621 GETSHORT(l2tp->source_tunnel_id, inp);
622 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: Assigned tunnel ID %"U16_F"\n", l2tp->source_tunnel_id));
624#if PPPOL2TP_AUTH_SUPPORT
625 case PPPOL2TP_AVPTYPE_CHALLENGE:
627 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: Challenge length check failed\n"));
630 if (l2tp->secret ==
NULL) {
631 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: Received challenge from peer and no secret key available\n"));
632 pppol2tp_abort_connect(l2tp);
638 challenge_id = PPPOL2TP_MESSAGETYPE_SCCCN;
639 lwip_md5_update(&
md5_ctx, &challenge_id, 1);
640 lwip_md5_update(&
md5_ctx, l2tp->secret, l2tp->secret_len);
641 lwip_md5_update(&
md5_ctx, inp, avplen);
642 lwip_md5_finish(&
md5_ctx, l2tp->challenge_hash);
644 l2tp->send_challenge = 1;
646 case PPPOL2TP_AVPTYPE_CHALLENGERESPONSE:
647 if (avplen != PPPOL2TP_AVPTYPE_CHALLENGERESPONSE_SIZE) {
648 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: AVP Challenge Response length check failed\n"));
654 challenge_id = PPPOL2TP_MESSAGETYPE_SCCRP;
655 lwip_md5_update(&
md5_ctx, &challenge_id, 1);
656 lwip_md5_update(&
md5_ctx, l2tp->secret, l2tp->secret_len);
657 lwip_md5_update(&
md5_ctx, l2tp->secret_rv,
sizeof(l2tp->secret_rv));
658 lwip_md5_finish(&
md5_ctx, md5_hash);
660 if (
memcmp(inp, md5_hash,
sizeof(md5_hash)) ) {
661 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: Received challenge response from peer and secret key do not match\n"));
662 pppol2tp_abort_connect(l2tp);
672 case PPPOL2TP_MESSAGETYPE_ICRP:
673 switch (attributetype) {
674 case PPPOL2TP_AVPTYPE_SESSIONID:
675 if (avplen !=
sizeof(l2tp->source_session_id) ) {
676 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: AVP Assign session ID length check failed\n"));
679 GETSHORT(l2tp->source_session_id, inp);
680 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: Assigned session ID %"U16_F"\n", l2tp->source_session_id));
695 if (
pbuf_remove_header(
p, avplen +
sizeof(avpflags) +
sizeof(vendorid) +
sizeof(attributetype)) != 0) {
700 switch(messagetype) {
702 case PPPOL2TP_MESSAGETYPE_SCCRP:
704 l2tp->remote_session_id = magic();
705 }
while(l2tp->remote_session_id == 0);
706 l2tp->tunnel_port =
port;
707 l2tp->icrq_retried = 0;
708 l2tp->phase = PPPOL2TP_STATE_ICRQ_SENT;
710 if ((
err = pppol2tp_send_scccn(l2tp, l2tp->our_ns)) != 0) {
711 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: failed to send SCCCN, error=%d\n",
err));
715 if ((
err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
716 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: failed to send ICRQ, error=%d\n",
err));
719 sys_untimeout(pppol2tp_timeout, l2tp);
720 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
723 case PPPOL2TP_MESSAGETYPE_ICRP:
724 l2tp->iccn_retried = 0;
725 l2tp->phase = PPPOL2TP_STATE_ICCN_SENT;
727 if ((
err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
728 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: failed to send ICCN, error=%d\n",
err));
731 sys_untimeout(pppol2tp_timeout, l2tp);
732 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
741 pppol2tp_send_zlb(l2tp, l2tp->our_ns+1, l2tp->peer_ns);
744 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: packet too short: %d\n",
p->len));
748static void pppol2tp_timeout(
void *
arg) {
749 pppol2tp_pcb *l2tp = (pppol2tp_pcb*)
arg;
753 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: timeout\n"));
755 switch (l2tp->phase) {
756 case PPPOL2TP_STATE_SCCRQ_SENT:
758 if (l2tp->sccrq_retried < 0xff) {
759 l2tp->sccrq_retried++;
761 if (!l2tp->ppp->settings.persist && l2tp->sccrq_retried >= PPPOL2TP_MAXSCCRQ) {
762 pppol2tp_abort_connect(l2tp);
765 retry_wait =
LWIP_MIN(PPPOL2TP_CONTROL_TIMEOUT * l2tp->sccrq_retried, PPPOL2TP_SLOW_RETRY);
766 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: sccrq_retried=%d\n", l2tp->sccrq_retried));
767 if ((
err = pppol2tp_send_sccrq(l2tp)) != 0) {
768 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: failed to send SCCRQ, error=%d\n",
err));
771 sys_timeout(retry_wait, pppol2tp_timeout, l2tp);
774 case PPPOL2TP_STATE_ICRQ_SENT:
775 l2tp->icrq_retried++;
776 if (l2tp->icrq_retried >= PPPOL2TP_MAXICRQ) {
777 pppol2tp_abort_connect(l2tp);
780 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: icrq_retried=%d\n", l2tp->icrq_retried));
781 if ((
s16_t)(l2tp->peer_nr - l2tp->our_ns) < 0) {
782 if ((
err = pppol2tp_send_scccn(l2tp, l2tp->our_ns -1)) != 0) {
783 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: failed to send SCCCN, error=%d\n",
err));
785 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
789 if ((
err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
790 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: failed to send ICRQ, error=%d\n",
err));
793 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
796 case PPPOL2TP_STATE_ICCN_SENT:
797 l2tp->iccn_retried++;
798 if (l2tp->iccn_retried >= PPPOL2TP_MAXICCN) {
799 pppol2tp_abort_connect(l2tp);
802 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried));
803 if ((
err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
804 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: failed to send ICCN, error=%d\n",
err));
807 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
816static void pppol2tp_abort_connect(pppol2tp_pcb *l2tp) {
817 PPPDEBUG(
LOG_DEBUG, (
"pppol2tp: could not establish connection\n"));
818 l2tp->phase = PPPOL2TP_STATE_INITIAL;
819 ppp_link_failed(l2tp->ppp);
823static err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp) {
829 len = 12 +8 +8 +10 +10 +6+
sizeof(PPPOL2TP_HOSTNAME)-1 +6+
sizeof(PPPOL2TP_VENDORNAME)-1 +8 +8;
830#if PPPOL2TP_AUTH_SUPPORT
831 if (l2tp->secret !=
NULL) {
832 len += 6 +
sizeof(l2tp->secret_rv);
846 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY,
p);
854 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
856 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE,
p);
857 PUTSHORT(PPPOL2TP_MESSAGETYPE_SCCRQ,
p);
860 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
862 PUTSHORT(PPPOL2TP_AVPTYPE_VERSION,
p);
863 PUTSHORT(PPPOL2TP_VERSION,
p);
866 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10,
p);
868 PUTSHORT(PPPOL2TP_AVPTYPE_FRAMINGCAPABILITIES,
p);
869 PUTLONG(PPPOL2TP_FRAMINGCAPABILITIES,
p);
872 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10,
p);
874 PUTSHORT(PPPOL2TP_AVPTYPE_BEARERCAPABILITIES,
p);
875 PUTLONG(PPPOL2TP_BEARERCAPABILITIES,
p);
878 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6+
sizeof(PPPOL2TP_HOSTNAME)-1,
p);
880 PUTSHORT(PPPOL2TP_AVPTYPE_HOSTNAME,
p);
881 MEMCPY(
p, PPPOL2TP_HOSTNAME,
sizeof(PPPOL2TP_HOSTNAME)-1);
882 INCPTR(
sizeof(PPPOL2TP_HOSTNAME)-1,
p);
885 PUTSHORT(6+
sizeof(PPPOL2TP_VENDORNAME)-1,
p);
887 PUTSHORT(PPPOL2TP_AVPTYPE_VENDORNAME,
p);
888 MEMCPY(
p, PPPOL2TP_VENDORNAME,
sizeof(PPPOL2TP_VENDORNAME)-1);
889 INCPTR(
sizeof(PPPOL2TP_VENDORNAME)-1,
p);
892 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
894 PUTSHORT(PPPOL2TP_AVPTYPE_TUNNELID,
p);
895 PUTSHORT(l2tp->remote_tunnel_id,
p);
898 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
900 PUTSHORT(PPPOL2TP_AVPTYPE_RECEIVEWINDOWSIZE,
p);
901 PUTSHORT(PPPOL2TP_RECEIVEWINDOWSIZE,
p);
903#if PPPOL2TP_AUTH_SUPPORT
905 if (l2tp->secret !=
NULL) {
906 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 +
sizeof(l2tp->secret_rv),
p);
908 PUTSHORT(PPPOL2TP_AVPTYPE_CHALLENGE,
p);
909 MEMCPY(
p, l2tp->secret_rv,
sizeof(l2tp->secret_rv));
910 INCPTR(
sizeof(l2tp->secret_rv),
p);
914 return pppol2tp_udp_send(l2tp, pb);
918static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp,
u16_t ns) {
925#if PPPOL2TP_AUTH_SUPPORT
926 if (l2tp->send_challenge) {
927 len += 6 +
sizeof(l2tp->challenge_hash);
941 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY,
p);
943 PUTSHORT(l2tp->source_tunnel_id,
p);
946 PUTSHORT(l2tp->peer_ns,
p);
949 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
951 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE,
p);
952 PUTSHORT(PPPOL2TP_MESSAGETYPE_SCCCN,
p);
954#if PPPOL2TP_AUTH_SUPPORT
956 if (l2tp->send_challenge) {
957 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 +
sizeof(l2tp->challenge_hash),
p);
959 PUTSHORT(PPPOL2TP_AVPTYPE_CHALLENGERESPONSE,
p);
960 MEMCPY(
p, l2tp->challenge_hash,
sizeof(l2tp->challenge_hash));
961 INCPTR(
sizeof(l2tp->challenge_hash),
p);
965 return pppol2tp_udp_send(l2tp, pb);
969static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp,
u16_t ns) {
988 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY,
p);
990 PUTSHORT(l2tp->source_tunnel_id,
p);
993 PUTSHORT(l2tp->peer_ns,
p);
996 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
998 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE,
p);
999 PUTSHORT(PPPOL2TP_MESSAGETYPE_ICRQ,
p);
1002 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
1004 PUTSHORT(PPPOL2TP_AVPTYPE_SESSIONID,
p);
1005 PUTSHORT(l2tp->remote_session_id,
p);
1008 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10,
p);
1010 PUTSHORT(PPPOL2TP_AVPTYPE_CALLSERIALNUMBER,
p);
1011 serialnumber = magic();
1012 PUTLONG(serialnumber,
p);
1014 return pppol2tp_udp_send(l2tp, pb);
1018static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp,
u16_t ns) {
1024 len = 12 +8 +10 +10;
1036 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY,
p);
1038 PUTSHORT(l2tp->source_tunnel_id,
p);
1039 PUTSHORT(l2tp->source_session_id,
p);
1041 PUTSHORT(l2tp->peer_ns,
p);
1044 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
1046 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE,
p);
1047 PUTSHORT(PPPOL2TP_MESSAGETYPE_ICCN,
p);
1050 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10,
p);
1052 PUTSHORT(PPPOL2TP_AVPTYPE_FRAMINGTYPE,
p);
1053 PUTLONG(PPPOL2TP_FRAMINGTYPE,
p);
1056 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10,
p);
1058 PUTSHORT(PPPOL2TP_AVPTYPE_TXCONNECTSPEED,
p);
1059 PUTLONG(PPPOL2TP_TXCONNECTSPEED,
p);
1061 return pppol2tp_udp_send(l2tp, pb);
1083 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY,
p);
1085 PUTSHORT(l2tp->source_tunnel_id,
p);
1090 return pppol2tp_udp_send(l2tp, pb);
1094static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp,
u16_t ns) {
1112 PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY,
p);
1114 PUTSHORT(l2tp->source_tunnel_id,
p);
1117 PUTSHORT(l2tp->peer_ns,
p);
1120 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
1122 PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE,
p);
1123 PUTSHORT(PPPOL2TP_MESSAGETYPE_STOPCCN,
p);
1126 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
1128 PUTSHORT(PPPOL2TP_AVPTYPE_TUNNELID,
p);
1129 PUTSHORT(l2tp->remote_tunnel_id,
p);
1132 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8,
p);
1134 PUTSHORT(PPPOL2TP_AVPTYPE_RESULTCODE,
p);
1135 PUTSHORT(PPPOL2TP_RESULTCODE,
p);
1137 return pppol2tp_udp_send(l2tp, pb);
1140static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp,
struct pbuf *pb) {
1146 PPPDEBUG(
LOG_ERR, (
"pppol2tp: pppol2tp_pcb: could not allocate room for L2TP header\n"));
1153 PUTSHORT(PPPOL2TP_HEADERFLAG_DATA_MANDATORY,
p);
1154 PUTSHORT(l2tp->source_tunnel_id,
p);
1155 PUTSHORT(l2tp->source_session_id,
p);
1157 return pppol2tp_udp_send(l2tp, pb);
1160static err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp,
struct pbuf *pb) {
1163 err = udp_sendto_if(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port, l2tp->netif);
1165 err = udp_sendto(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port);
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
#define LWIP_ASSERT(message, assertion)
#define MIB2_STATS_NETIF_ADD(n, x, val)
#define MIB2_STATS_NETIF_INC(n, x)
GLenum const GLvoid * addr
#define LWIP_UNUSED_ARG(x)
#define LWIP_MEMPOOL_DECLARE(name, num, size, desc)
#define LWIP_MEMPOOL_ALLOC(name)
#define LWIP_MEMPOOL_FREE(name, x)
struct pbuf * pbuf_coalesce(struct pbuf *p, pbuf_layer layer)
void pbuf_cat(struct pbuf *h, struct pbuf *t)
void pbuf_chain(struct pbuf *h, struct pbuf *t)
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
u8_t pbuf_free(struct pbuf *p)
#define IP_IS_V6_VAL(ipaddr)
#define ip_addr_eq(addr1, addr2)
#define ip_addr_copy(dest, src)
#define IP_GET_TYPE(ipaddr)
#define MEMCPY(DST, SRC, BYTES)
static DATA_BLOB CRYPTPROTECT_PROMPTSTRUCT DATA_BLOB *static LPWSTR DATA_BLOB CRYPTPROTECT_PROMPTSTRUCT DATA_BLOB *static char secret[]
u8_t pbuf_add_header(struct pbuf *p, size_t header_size_increment)
u8_t pbuf_remove_header(struct pbuf *p, size_t header_size_decrement)
#define LINK_STATS_INC(x)