Lines Matching defs:l2tp

81 static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, u16_t port, struct pbuf *p, u16_t ns, u16_t nr);
83 static void pppol2tp_abort_connect(pppol2tp_pcb *l2tp);
84 static err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp);
85 static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp, u16_t ns);
86 static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns);
87 static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns);
88 static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns, u16_t nr);
89 static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns);
90 static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb);
91 static err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp, struct pbuf *pb);
114 pppol2tp_pcb *l2tp;
125 l2tp = (pppol2tp_pcb *)LWIP_MEMPOOL_ALLOC(PPPOL2TP_PCB);
126 if (l2tp == NULL) {
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;
143 l2tp->ppp = ppp;
144 l2tp->udp = udp;
145 l2tp->netif = netif;
146 ip_addr_copy(l2tp->remote_ip, *ipaddr);
147 l2tp->remote_port = port;
149 l2tp->secret = secret;
150 l2tp->secret_len = secret_len;
158 LWIP_MEMPOOL_FREE(PPPOL2TP_PCB, l2tp);
166 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
190 ret = pppol2tp_xmit(l2tp, ph);
205 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
234 if( (err = pppol2tp_xmit(l2tp, pb)) != ERR_OK) {
248 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
251 sys_untimeout(pppol2tp_timeout, l2tp);
252 udp_remove(l2tp->udp);
253 LWIP_MEMPOOL_FREE(PPPOL2TP_PCB, l2tp);
260 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
268 l2tp->tunnel_port = l2tp->remote_port;
269 l2tp->our_ns = 0;
270 l2tp->peer_nr = 0;
271 l2tp->peer_ns = 0;
272 l2tp->source_tunnel_id = 0;
273 l2tp->remote_tunnel_id = 0;
274 l2tp->source_session_id = 0;
275 l2tp->remote_session_id = 0;
276 /* l2tp->*_retried are cleared when used */
306 if (IP_IS_V6_VAL(l2tp->udp->local_ip)) {
307 udp_bind(l2tp->udp, IP6_ADDR_ANY, 0);
310 udp_bind(l2tp->udp, IP_ADDR_ANY, 0);
314 if (l2tp->secret != NULL) {
315 magic_random_bytes(l2tp->secret_rv, sizeof(l2tp->secret_rv));
320 l2tp->remote_tunnel_id = magic();
321 } while(l2tp->remote_tunnel_id == 0);
323 l2tp->sccrq_retried = 0;
324 l2tp->phase = PPPOL2TP_STATE_SCCRQ_SENT;
325 if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {
328 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
333 pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
335 l2tp->our_ns++;
336 pppol2tp_send_stopccn(l2tp, l2tp->our_ns);
339 sys_untimeout(pppol2tp_timeout, l2tp);
340 l2tp->phase = PPPOL2TP_STATE_INITIAL;
346 pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;
352 if (l2tp->phase < PPPOL2TP_STATE_SCCRQ_SENT) {
356 if (!ip_addr_cmp(&l2tp->remote_ip, addr)) {
361 if (l2tp->phase > PPPOL2TP_STATE_SCCRQ_SENT && l2tp->tunnel_port != port) {
447 pppol2tp_dispatch_control_packet(l2tp, port, p, ns, nr);
452 if(l2tp->phase != PPPOL2TP_STATE_DATA) {
455 if(tunnel_id != l2tp->remote_tunnel_id) {
456 PPPDEBUG(LOG_DEBUG, ("pppol2tp: tunnel ID mismatch, assigned=%d, received=%d\n", l2tp->remote_tunnel_id, tunnel_id));
459 if(session_id != l2tp->remote_session_id) {
460 PPPDEBUG(LOG_DEBUG, ("pppol2tp: session ID mismatch, assigned=%d, received=%d\n", l2tp->remote_session_id, session_id));
476 ppp_input(l2tp->ppp, p);
486 static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, u16_t port, struct pbuf *p, u16_t ns, u16_t nr) {
499 if (ns != l2tp->peer_ns) {
500 PPPDEBUG(LOG_DEBUG, ("pppol2tp: drop unexpected packet: received NS=%d, expected NS=%d\n", ns, l2tp->peer_ns));
510 if ((s16_t)(ns - l2tp->peer_ns) < 0) {
511 pppol2tp_send_zlb(l2tp, nr, ns+1);
516 l2tp->peer_nr = nr;
519 if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && (s16_t)(l2tp->peer_nr - l2tp->our_ns) > 0) {
520 l2tp->phase = PPPOL2TP_STATE_DATA;
521 sys_untimeout(pppol2tp_timeout, l2tp);
522 ppp_start(l2tp->ppp); /* notify upper layers */
530 l2tp->peer_ns = ns+1;
561 if (l2tp->phase != PPPOL2TP_STATE_SCCRQ_SENT) {
568 if (l2tp->phase != PPPOL2TP_STATE_ICRQ_SENT) {
574 pppol2tp_send_zlb(l2tp, l2tp->our_ns+1, l2tp->peer_ns); /* Ack the StopCCN before we switch to down state */
575 if (l2tp->phase < PPPOL2TP_STATE_DATA) {
576 pppol2tp_abort_connect(l2tp);
577 } else if (l2tp->phase == PPPOL2TP_STATE_DATA) {
601 if (avplen != sizeof(l2tp->source_tunnel_id) ) {
605 GETSHORT(l2tp->source_tunnel_id, inp);
606 PPPDEBUG(LOG_DEBUG, ("pppol2tp: Assigned tunnel ID %"U16_F"\n", l2tp->source_tunnel_id));
614 if (l2tp->secret == NULL) {
616 pppol2tp_abort_connect(l2tp);
624 lwip_md5_update(&md5_ctx, l2tp->secret, l2tp->secret_len);
626 lwip_md5_finish(&md5_ctx, l2tp->challenge_hash);
628 l2tp->send_challenge = 1;
640 lwip_md5_update(&md5_ctx, l2tp->secret, l2tp->secret_len);
641 lwip_md5_update(&md5_ctx, l2tp->secret_rv, sizeof(l2tp->secret_rv));
646 pppol2tp_abort_connect(l2tp);
659 if (avplen != sizeof(l2tp->source_session_id) ) {
663 GETSHORT(l2tp->source_session_id, inp);
664 PPPDEBUG(LOG_DEBUG, ("pppol2tp: Assigned session ID %"U16_F"\n", l2tp->source_session_id));
688 l2tp->remote_session_id = magic();
689 } while(l2tp->remote_session_id == 0);
690 l2tp->tunnel_port = port; /* LNS server might have chosen its own local port */
691 l2tp->icrq_retried = 0;
692 l2tp->phase = PPPOL2TP_STATE_ICRQ_SENT;
693 l2tp->our_ns++;
694 if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns)) != 0) {
698 l2tp->our_ns++;
699 if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
703 sys_untimeout(pppol2tp_timeout, l2tp);
704 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
708 l2tp->iccn_retried = 0;
709 l2tp->phase = PPPOL2TP_STATE_ICCN_SENT;
710 l2tp->our_ns++;
711 if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
715 sys_untimeout(pppol2tp_timeout, l2tp);
716 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
725 pppol2tp_send_zlb(l2tp, l2tp->our_ns+1, l2tp->peer_ns);
733 pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;
739 switch (l2tp->phase) {
742 if (l2tp->sccrq_retried < 0xff) {
743 l2tp->sccrq_retried++;
745 if (!l2tp->ppp->settings.persist && l2tp->sccrq_retried >= PPPOL2TP_MAXSCCRQ) {
746 pppol2tp_abort_connect(l2tp);
749 retry_wait = LWIP_MIN(PPPOL2TP_CONTROL_TIMEOUT * l2tp->sccrq_retried, PPPOL2TP_SLOW_RETRY);
750 PPPDEBUG(LOG_DEBUG, ("pppol2tp: sccrq_retried=%d\n", l2tp->sccrq_retried));
751 if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {
752 l2tp->sccrq_retried--;
756 sys_timeout(retry_wait, pppol2tp_timeout, l2tp);
760 l2tp->icrq_retried++;
761 if (l2tp->icrq_retried >= PPPOL2TP_MAXICRQ) {
762 pppol2tp_abort_connect(l2tp);
765 PPPDEBUG(LOG_DEBUG, ("pppol2tp: icrq_retried=%d\n", l2tp->icrq_retried));
766 if ((s16_t)(l2tp->peer_nr - l2tp->our_ns) < 0) { /* the SCCCN was not acknowledged */
767 if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns -1)) != 0) {
768 l2tp->icrq_retried--;
771 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
775 if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
776 l2tp->icrq_retried--;
780 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
784 l2tp->iccn_retried++;
785 if (l2tp->iccn_retried >= PPPOL2TP_MAXICCN) {
786 pppol2tp_abort_connect(l2tp);
789 PPPDEBUG(LOG_DEBUG, ("pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried));
790 if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
791 l2tp->iccn_retried--;
795 sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
804 static void pppol2tp_abort_connect(pppol2tp_pcb *l2tp) {
806 l2tp->phase = PPPOL2TP_STATE_INITIAL;
807 ppp_link_failed(l2tp->ppp); /* notify upper layers */
811 static err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp) {
819 if (l2tp->secret != NULL) {
820 len += 6 + sizeof(l2tp->secret_rv);
883 PUTSHORT(l2tp->remote_tunnel_id, p); /* Attribute value: Tunnel ID */
893 if (l2tp->secret != NULL) {
894 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 + sizeof(l2tp->secret_rv), p); /* Mandatory flag + len field */
897 MEMCPY(p, l2tp->secret_rv, sizeof(l2tp->secret_rv)); /* Attribute value: Random vector */
898 INCPTR(sizeof(l2tp->secret_rv), p);
902 return pppol2tp_udp_send(l2tp, pb);
906 static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp, u16_t ns) {
914 if (l2tp->send_challenge) {
915 len += 6 + sizeof(l2tp->challenge_hash);
931 PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
934 PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */
944 if (l2tp->send_challenge) {
945 PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 + sizeof(l2tp->challenge_hash), p); /* Mandatory flag + len field */
948 MEMCPY(p, l2tp->challenge_hash, sizeof(l2tp->challenge_hash)); /* Attribute value: Computed challenge */
949 INCPTR(sizeof(l2tp->challenge_hash), p);
953 return pppol2tp_udp_send(l2tp, pb);
957 static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns) {
978 PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
981 PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */
993 PUTSHORT(l2tp->remote_session_id, p); /* Attribute value: Session ID */
1002 return pppol2tp_udp_send(l2tp, pb);
1006 static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns) {
1026 PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
1027 PUTSHORT(l2tp->source_session_id, p); /* Session Id */
1029 PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */
1049 return pppol2tp_udp_send(l2tp, pb);
1053 static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns, u16_t nr) {
1073 PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
1078 return pppol2tp_udp_send(l2tp, pb);
1082 static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns) {
1102 PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
1105 PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */
1117 PUTSHORT(l2tp->remote_tunnel_id, p); /* Attribute value: Tunnel ID */
1125 return pppol2tp_udp_send(l2tp, pb);
1128 static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb) {
1142 PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
1143 PUTSHORT(l2tp->source_session_id, p); /* Session Id */
1145 return pppol2tp_udp_send(l2tp, pb);
1148 static err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp, struct pbuf *pb) {
1150 if (l2tp->netif) {
1151 err = udp_sendto_if(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port, l2tp->netif);
1153 err = udp_sendto(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port);