152#if LWIP_PPP_API && LWIP_MPU_COMPATIBLE
159static struct timeval start_time;
160static struct pppd_stats old_link_stats;
161struct pppd_stats link_stats;
162unsigned link_connect_time;
171const struct protent*
const protocols[] = {
204static void ppp_do_connect(
void *
arg);
207static err_t ppp_netif_output_ip4(
struct netif *
netif,
struct pbuf *pb,
const ip4_addr_t *ipaddr);
210static err_t ppp_netif_output_ip6(
struct netif *
netif,
struct pbuf *pb,
const ip6_addr_t *ipaddr);
218void ppp_set_auth(ppp_pcb *pcb,
u8_t authtype,
const char *
user,
const char *passwd) {
219 LWIP_ASSERT(
"pcb->phase == PPP_PHASE_DEAD", pcb->phase == PPP_PHASE_DEAD);
222 pcb->settings.refuse_pap = !(authtype & PPPAUTHTYPE_PAP);
225 pcb->settings.refuse_chap = !(authtype & PPPAUTHTYPE_CHAP);
227 pcb->settings.refuse_mschap = !(authtype & PPPAUTHTYPE_MSCHAP);
228 pcb->settings.refuse_mschap_v2 = !(authtype & PPPAUTHTYPE_MSCHAP_V2);
232 pcb->settings.refuse_eap = !(authtype & PPPAUTHTYPE_EAP);
234 pcb->settings.user =
user;
235 pcb->settings.passwd = passwd;
241void ppp_set_mppe(ppp_pcb *pcb,
u8_t flags) {
242 LWIP_ASSERT(
"pcb->phase == PPP_PHASE_DEAD", pcb->phase == PPP_PHASE_DEAD);
244 if (
flags == PPP_MPPE_DISABLE) {
245 pcb->settings.require_mppe = 0;
249 pcb->settings.require_mppe = 1;
250 pcb->settings.refuse_mppe_stateful = !(
flags & PPP_MPPE_ALLOW_STATEFUL);
251 pcb->settings.refuse_mppe_40 = !!(
flags & PPP_MPPE_REFUSE_40);
252 pcb->settings.refuse_mppe_128 = !!(
flags & PPP_MPPE_REFUSE_128);
257void ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb) {
259 pcb->notify_phase_cb = notify_phase_cb;
260 notify_phase_cb(pcb, pcb->phase, pcb->ctx_cb);
275err_t ppp_connect(ppp_pcb *pcb,
u16_t holdoff) {
277 if (pcb->phase != PPP_PHASE_DEAD) {
281 PPPDEBUG(
LOG_DEBUG, (
"ppp_connect[%d]: holdoff=%d\n", pcb->netif->num, holdoff));
290 new_phase(pcb, PPP_PHASE_HOLDOFF);
291 sys_timeout((
u32_t)(holdoff*1000), ppp_do_connect, pcb);
304err_t ppp_listen(ppp_pcb *pcb) {
306 if (pcb->phase != PPP_PHASE_DEAD) {
310 PPPDEBUG(
LOG_DEBUG, (
"ppp_listen[%d]\n", pcb->netif->num));
314 if (pcb->link_cb->listen) {
315 new_phase(pcb, PPP_PHASE_INITIALIZE);
316 pcb->link_cb->listen(pcb, pcb->link_ctx_cb);
335ppp_close(ppp_pcb *pcb,
u8_t nocarrier)
339 pcb->err_code = PPPERR_USER;
342 if (pcb->phase == PPP_PHASE_HOLDOFF) {
343 sys_untimeout(ppp_do_connect, pcb);
344 new_phase(pcb, PPP_PHASE_DEAD);
348 if (pcb->phase == PPP_PHASE_DEAD) {
349 pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
354 if (pcb->phase >= PPP_PHASE_TERMINATE) {
359 if (pcb->phase < PPP_PHASE_ESTABLISH) {
360 new_phase(pcb, PPP_PHASE_DISCONNECT);
361 ppp_link_terminated(pcb);
372 if (nocarrier && pcb->phase == PPP_PHASE_RUNNING) {
373 PPPDEBUG(
LOG_DEBUG, (
"ppp_close[%d]: carrier lost -> lcp_lowerdown\n", pcb->netif->num));
376 link_terminated(pcb);
381 PPPDEBUG(
LOG_DEBUG, (
"ppp_close[%d]: kill_link -> lcp_close\n", pcb->netif->num));
383 lcp_close(pcb,
"User request");
397err_t ppp_free(ppp_pcb *pcb) {
400 if (pcb->phase != PPP_PHASE_DEAD) {
404 PPPDEBUG(
LOG_DEBUG, (
"ppp_free[%d]\n", pcb->netif->num));
408 err = pcb->link_cb->free(pcb, pcb->link_ctx_cb);
425 case PPPCTLG_UPSTATUS:
429 *(
int *)
arg = (
int)(0
439 case PPPCTLG_ERRCODE:
443 *(
int *)
arg = (
int)(pcb->err_code);
459static void ppp_do_connect(
void *
arg) {
460 ppp_pcb *pcb = (ppp_pcb*)
arg;
462 LWIP_ASSERT(
"pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF", pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF);
464 new_phase(pcb, PPP_PHASE_INITIALIZE);
465 pcb->link_cb->connect(pcb, pcb->link_ctx_cb);
475 netif->output = ppp_netif_output_ip4;
478 netif->output_ip6 = ppp_netif_output_ip6;
480#if LWIP_NETIF_HOSTNAME
491static err_t ppp_netif_output_ip4(
struct netif *
netif,
struct pbuf *pb,
const ip4_addr_t *ipaddr) {
493 return ppp_netif_output(
netif, pb, PPP_IP);
501static err_t ppp_netif_output_ip6(
struct netif *
netif,
struct pbuf *pb,
const ip6_addr_t *ipaddr) {
503 return ppp_netif_output(
netif, pb, PPP_IPV6);
515 || (
protocol == PPP_IP && !pcb->if4_up)
518 || (
protocol == PPP_IPV6 && !pcb->if6_up)
521 PPPDEBUG(
LOG_ERR, (
"ppp_netif_output[%d]: link not up\n", pcb->netif->num));
527 if (pcb->settings.require_mppe && pcb->ccp_transmit_method != CI_MPPE) {
528 PPPDEBUG(
LOG_ERR, (
"ppp_netif_output[%d]: MPPE required, not up\n", pcb->netif->num));
538 if (
protocol == PPP_IP && pcb->vj_enabled) {
539 switch (vj_compress_tcp(&pcb->vj_comp, &pb)) {
544 case TYPE_COMPRESSED_TCP:
550 case TYPE_UNCOMPRESSED_TCP:
557 PPPDEBUG(
LOG_WARNING, (
"ppp_netif_output[%d]: bad IP packet\n", pcb->netif->num));
567 switch (pcb->ccp_transmit_method) {
589 PPPDEBUG(
LOG_ERR, (
"ppp_netif_output[%d]: bad CCP transmit method\n", pcb->netif->num));
594 err = pcb->link_cb->netif_output(pcb, pcb->link_ctx_cb, pb,
protocol);
625#if LWIP_PPP_API && LWIP_MPU_COMPATIBLE
649ppp_pcb *ppp_new(
struct netif *pppif,
const struct link_callbacks *
callbacks,
void *link_ctx_cb, ppp_link_status_cb_fn link_status_cb,
void *ctx_cb) {
651 const struct protent *protp;
656 if (link_status_cb ==
NULL) {
665 memset(pcb, 0,
sizeof(ppp_pcb));
669 pcb->settings.pap_timeout_time = UPAP_DEFTIMEOUT;
670 pcb->settings.pap_max_transmits = UPAP_DEFTRANSMITS;
672 pcb->settings.pap_req_timeout = UPAP_DEFREQTIME;
678 pcb->settings.chap_timeout_time = CHAP_DEFTIMEOUT;
679 pcb->settings.chap_max_transmits = CHAP_DEFTRANSMITS;
680 pcb->settings.chap_rechallenge_time = CHAP_DEFRECHALLENGETIME;
685 pcb->settings.eap_req_time = EAP_DEFREQTIME;
686 pcb->settings.eap_allow_req = EAP_DEFALLOWREQ;
688 pcb->settings.eap_timeout_time = EAP_DEFTIMEOUT;
689 pcb->settings.eap_max_transmits = EAP_DEFTRANSMITS;
693 pcb->settings.lcp_loopbackfail = LCP_DEFLOOPBACKFAIL;
694 pcb->settings.lcp_echo_interval = LCP_ECHOINTERVAL;
695 pcb->settings.lcp_echo_fails = LCP_MAXECHOFAILS;
697 pcb->settings.fsm_timeout_time = FSM_DEFTIMEOUT;
698 pcb->settings.fsm_max_conf_req_transmits = FSM_DEFMAXCONFREQS;
699 pcb->settings.fsm_max_term_transmits = FSM_DEFMAXTERMREQS;
700 pcb->settings.fsm_max_nak_loops = FSM_DEFMAXNAKLOOPS;
706 IP4_ADDR_ANY4, IP4_ADDR_BROADCAST, IP4_ADDR_ANY4,
708 (
void *)pcb, ppp_netif_init_cb,
NULL)) {
710 PPPDEBUG(
LOG_ERR, (
"ppp_new: netif_add failed\n"));
718 pcb->link_ctx_cb = link_ctx_cb;
719 pcb->link_status_cb = link_status_cb;
720 pcb->ctx_cb = ctx_cb;
729 new_phase(pcb, PPP_PHASE_DEAD);
734void ppp_start(ppp_pcb *pcb) {
735 PPPDEBUG(
LOG_DEBUG, (
"ppp_start[%d]\n", pcb->netif->num));
739 link_stats_valid = 0;
742 pcb->mppe_keys_set = 0;
743 memset(&pcb->mppe_comp, 0,
sizeof(pcb->mppe_comp));
744 memset(&pcb->mppe_decomp, 0,
sizeof(pcb->mppe_decomp));
747 vj_compress_init(&pcb->vj_comp);
751 new_phase(pcb, PPP_PHASE_ESTABLISH);
754 PPPDEBUG(
LOG_DEBUG, (
"ppp_start[%d]: finished\n", pcb->netif->num));
758void ppp_link_failed(ppp_pcb *pcb) {
759 PPPDEBUG(
LOG_DEBUG, (
"ppp_link_failed[%d]\n", pcb->netif->num));
760 new_phase(pcb, PPP_PHASE_DEAD);
761 pcb->err_code = PPPERR_OPEN;
762 pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
766void ppp_link_end(ppp_pcb *pcb) {
767 PPPDEBUG(
LOG_DEBUG, (
"ppp_link_end[%d]\n", pcb->netif->num));
768 new_phase(pcb, PPP_PHASE_DEAD);
769 if (pcb->err_code == PPPERR_NONE) {
770 pcb->err_code = PPPERR_CONNECT;
772 pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
779void ppp_input(ppp_pcb *pcb,
struct pbuf *pb) {
781#if PPP_DEBUG && PPP_PROTOCOLNAME
784 LWIP_ASSERT(
"pcb->phase >= PPP_PHASE_ESTABLISH && pcb->phase <= PPP_PHASE_TERMINATE",
785 pcb->phase >= PPP_PHASE_ESTABLISH && pcb->phase <= PPP_PHASE_TERMINATE);
790 PPPDEBUG(
LOG_ERR, (
"ppp_input[%d]: packet too short\n", pcb->netif->num));
796 ppp_dump_packet(pcb,
"rcvd", (
unsigned char *)pb->
payload, pb->
len);
808 if (
protocol != PPP_LCP && pcb->lcp_fsm.state != PPP_FSM_OPENED) {
809 ppp_dbglog((
"Discarded non-LCP packet when LCP not open"));
817 if (pcb->phase <= PPP_PHASE_AUTHENTICATE
832 ppp_dbglog((
"discarding proto 0x%x in phase %d",
protocol, pcb->phase));
844 if (pcb->settings.require_mppe &&
protocol != PPP_COMP &&
protocol < 0x8000) {
845 PPPDEBUG(
LOG_ERR, (
"ppp_input[%d]: MPPE required, received unencrypted data!\n", pcb->netif->num));
853 switch (pcb->ccp_receive_method) {
856 if (mppe_decompress(pcb, &pcb->mppe_decomp, &pb) !=
ERR_OK) {
862 PPPDEBUG(
LOG_ERR, (
"ppp_input[%d]: bad CCP receive method\n", pcb->netif->num));
887 PPPDEBUG(
LOG_INFO, (
"ppp_input[%d]: ip in pbuf len=%d\n", pcb->netif->num, pb->
tot_len));
888 ip4_input(pb, pcb->netif);
894 PPPDEBUG(
LOG_INFO, (
"ppp_input[%d]: ip6 in pbuf len=%d\n", pcb->netif->num, pb->
tot_len));
895 ip6_input(pb, pcb->netif);
905 PPPDEBUG(
LOG_INFO, (
"ppp_input[%d]: vj_comp in pbuf len=%d\n", pcb->netif->num, pb->
tot_len));
906 if (pcb->vj_enabled && vj_uncompress_tcp(&pb, &pcb->vj_comp) >= 0) {
907 ip4_input(pb, pcb->netif);
911 PPPDEBUG(
LOG_WARNING, (
"ppp_input[%d]: Dropping VJ compressed\n", pcb->netif->num));
919 PPPDEBUG(
LOG_INFO, (
"ppp_input[%d]: vj_un in pbuf len=%d\n", pcb->netif->num, pb->
tot_len));
920 if (pcb->vj_enabled && vj_uncompress_uncomp(pb, &pcb->vj_comp) >= 0) {
921 ip4_input(pb, pcb->netif);
925 PPPDEBUG(
LOG_WARNING, (
"ppp_input[%d]: Dropping VJ uncompressed\n", pcb->netif->num));
931 const struct protent *protp;
940 PPPDEBUG(
LOG_WARNING, (
"ppp_input[%d]: Dropping (pbuf_coalesce failed), len=%d\n", pcb->netif->num, pb->
tot_len));
959 if (
protocol == (protp->protocol & ~0x8000)
960 && protp->datainput !=
NULL) {
961 (*protp->datainput)(pcb, pb->
payload, pb->
len);
971 ppp_warn((
"Unsupported protocol '%s' (0x%x) received",
pname,
protocol));
974 ppp_warn((
"Unsupported protocol 0x%x received",
protocol));
978 PPPDEBUG(
LOG_WARNING, (
"ppp_input[%d]: Dropping (pbuf_add_header failed)\n", pcb->netif->num));
1002err_t ppp_write(ppp_pcb *pcb,
struct pbuf *
p) {
1004 ppp_dump_packet(pcb,
"sent", (
unsigned char *)
p->payload+2,
p->len-2);
1006 return pcb->link_cb->write(pcb, pcb->link_ctx_cb,
p);
1009void ppp_link_terminated(ppp_pcb *pcb) {
1010 PPPDEBUG(
LOG_DEBUG, (
"ppp_link_terminated[%d]\n", pcb->netif->num));
1011 pcb->link_cb->disconnect(pcb, pcb->link_ctx_cb);
1012 PPPDEBUG(
LOG_DEBUG, (
"ppp_link_terminated[%d]: finished.\n", pcb->netif->num));
1024void new_phase(ppp_pcb *pcb,
int p) {
1026 PPPDEBUG(
LOG_DEBUG, (
"ppp phase changed[%d]: phase=%d\n", pcb->netif->num, pcb->phase));
1028 if (pcb->notify_phase_cb !=
NULL) {
1029 pcb->notify_phase_cb(pcb,
p, pcb->ctx_cb);
1038int ppp_send_config(ppp_pcb *pcb,
int mtu,
u32_t accm,
int pcomp,
int accomp) {
1041 PPPDEBUG(
LOG_INFO, (
"ppp_send_config[%d]\n", pcb->netif->num));
1043 if (pcb->link_cb->send_config) {
1044 pcb->link_cb->send_config(pcb, pcb->link_ctx_cb, accm, pcomp, accomp);
1054int ppp_recv_config(ppp_pcb *pcb,
int mru,
u32_t accm,
int pcomp,
int accomp) {
1057 PPPDEBUG(
LOG_INFO, (
"ppp_recv_config[%d]\n", pcb->netif->num));
1059 if (pcb->link_cb->recv_config) {
1060 pcb->link_cb->recv_config(pcb, pcb->link_ctx_cb, accm, pcomp, accomp);
1070int sifaddr(ppp_pcb *pcb,
u32_t our_adr,
u32_t his_adr,
u32_t netmask) {
1071 ip4_addr_t
ip, nm, gw;
1073 ip4_addr_set_u32(&
ip, our_adr);
1074 ip4_addr_set_u32(&nm, netmask);
1075 ip4_addr_set_u32(&gw, his_adr);
1076 netif_set_addr(pcb->netif, &
ip, &nm, &gw);
1085int cifaddr(ppp_pcb *pcb,
u32_t our_adr,
u32_t his_adr) {
1089 netif_set_addr(pcb->netif, IP4_ADDR_ANY4, IP4_ADDR_BROADCAST, IP4_ADDR_ANY4);
1099int sifproxyarp(ppp_pcb *pcb,
u32_t his_adr) {
1110int cifproxyarp(ppp_pcb *pcb,
u32_t his_adr) {
1121int sdns(ppp_pcb *pcb,
u32_t ns1,
u32_t ns2) {
1125 ip_addr_set_ip4_u32_val(
ns, ns1);
1126 dns_setserver(0, &
ns);
1127 ip_addr_set_ip4_u32_val(
ns, ns2);
1128 dns_setserver(1, &
ns);
1136int cdns(ppp_pcb *pcb,
u32_t ns1,
u32_t ns2) {
1141 nsa = dns_getserver(0);
1142 ip_addr_set_ip4_u32_val(nsb, ns1);
1144 dns_setserver(0, IP_ADDR_ANY);
1146 nsa = dns_getserver(1);
1147 ip_addr_set_ip4_u32_val(nsb, ns2);
1149 dns_setserver(1, IP_ADDR_ANY);
1160int sifvjcomp(ppp_pcb *pcb,
int vjcomp,
int cidcomp,
int maxcid) {
1161 pcb->vj_enabled = vjcomp;
1162 pcb->vj_comp.compressSlot = cidcomp;
1163 pcb->vj_comp.maxSlotIndex = maxcid;
1164 PPPDEBUG(
LOG_INFO, (
"sifvjcomp[%d]: VJ compress enable=%d slot=%d max slot=%d\n",
1165 pcb->netif->num, vjcomp, cidcomp, maxcid));
1173int sifup(ppp_pcb *pcb) {
1175 pcb->err_code = PPPERR_NONE;
1178 PPPDEBUG(
LOG_DEBUG, (
"sifup[%d]: err_code=%d\n", pcb->netif->num, pcb->err_code));
1179 pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
1188int sifdown(ppp_pcb *pcb) {
1201 PPPDEBUG(
LOG_DEBUG, (
"sifdown[%d]: err_code=%d\n", pcb->netif->num, pcb->err_code));
1219 if (IP_CLASSA(
addr)) {
1220 nmask = IP_CLASSA_NET;
1221 }
else if (IP_CLASSB(
addr)) {
1222 nmask = IP_CLASSB_NET;
1224 nmask = IP_CLASSC_NET;
1238 return IPADDR_BROADCAST;
1243#define IN6_LLADDR_FROM_EUI64(ip6, eui64) do { \
1244 ip6.addr[0] = PP_HTONL(0xfe800000); \
1246 eui64_copy(eui64, ip6.addr[2]); \
1253int sif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64) {
1257 IN6_LLADDR_FROM_EUI64(ip6, our_eui64);
1258 netif_ip6_addr_set(pcb->netif, 0, &ip6);
1259 netif_ip6_addr_set_state(pcb->netif, 0, IP6_ADDR_PREFERRED);
1268int cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64) {
1272 netif_ip6_addr_set_state(pcb->netif, 0, IP6_ADDR_INVALID);
1273 netif_ip6_addr_set(pcb->netif, 0, IP6_ADDR_ANY6);
1280int sif6up(ppp_pcb *pcb) {
1283 pcb->err_code = PPPERR_NONE;
1286 PPPDEBUG(
LOG_DEBUG, (
"sif6up[%d]: err_code=%d\n", pcb->netif->num, pcb->err_code));
1287 pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
1296int sif6down(ppp_pcb *pcb) {
1309 PPPDEBUG(
LOG_DEBUG, (
"sif6down[%d]: err_code=%d\n", pcb->netif->num, pcb->err_code));
1318int sifnpmode(ppp_pcb *pcb,
int proto,
enum NPmode
mode) {
1329void ppp_netif_set_mtu(ppp_pcb *pcb,
int mtu) {
1331 pcb->netif->mtu = mtu;
1332#if PPP_IPV6_SUPPORT && LWIP_ND6_ALLOW_RA_UPDATES
1333 pcb->netif->mtu6 = mtu;
1335 PPPDEBUG(
LOG_INFO, (
"ppp_netif_set_mtu[%d]: mtu=%d\n", pcb->netif->num, mtu));
1341int ppp_netif_get_mtu(ppp_pcb *pcb) {
1343 return pcb->netif->mtu;
1352ccp_test(ppp_pcb *pcb,
u_char *opt_ptr,
int opt_len,
int for_transmit)
1366ccp_set(ppp_pcb *pcb,
u8_t isopen,
u8_t isup,
u8_t receive_method,
u8_t transmit_method)
1370 pcb->ccp_receive_method = receive_method;
1371 pcb->ccp_transmit_method = transmit_method;
1372 PPPDEBUG(
LOG_DEBUG, (
"ccp_set[%d]: is_open=%d, is_up=%d, receive_method=%u, transmit_method=%u\n",
1373 pcb->netif->num, isopen, isup, receive_method, transmit_method));
1377ccp_reset_comp(ppp_pcb *pcb)
1379 switch (pcb->ccp_transmit_method) {
1382 mppe_comp_reset(pcb, &pcb->mppe_comp);
1391ccp_reset_decomp(ppp_pcb *pcb)
1393 switch (pcb->ccp_receive_method) {
1396 mppe_decomp_reset(pcb, &pcb->mppe_decomp);
1411ccp_fatal_error(ppp_pcb *pcb)
1419#if PPP_IDLETIMELIMIT
1424int get_idle_time(ppp_pcb *pcb,
struct ppp_idle *
ip) {
1439int get_loop_output(
void) {
1446struct protocol_list {
1449}
const protocol_list[] = {
1451 { 0x23,
"OSI Network Layer" },
1452 { 0x25,
"Xerox NS IDP" },
1453 { 0x27,
"DECnet Phase IV" },
1454 { 0x29,
"Appletalk" },
1455 { 0x2b,
"Novell IPX" },
1456 { 0x2d,
"VJ compressed TCP/IP" },
1457 { 0x2f,
"VJ uncompressed TCP/IP" },
1458 { 0x31,
"Bridging PDU" },
1459 { 0x33,
"Stream Protocol ST-II" },
1460 { 0x35,
"Banyan Vines" },
1461 { 0x39,
"AppleTalk EDDP" },
1462 { 0x3b,
"AppleTalk SmartBuffered" },
1463 { 0x3d,
"Multi-Link" },
1464 { 0x3f,
"NETBIOS Framing" },
1465 { 0x41,
"Cisco Systems" },
1466 { 0x43,
"Ascom Timeplex" },
1467 { 0x45,
"Fujitsu Link Backup and Load Balancing (LBLB)" },
1468 { 0x47,
"DCA Remote Lan" },
1469 { 0x49,
"Serial Data Transport Protocol (PPP-SDTP)" },
1470 { 0x4b,
"SNA over 802.2" },
1472 { 0x4f,
"IP6 Header Compression" },
1473 { 0x51,
"KNX Bridging Data" },
1474 { 0x53,
"Encryption" },
1475 { 0x55,
"Individual Link Encryption" },
1477 { 0x59,
"PPP Muxing" },
1478 { 0x5b,
"Vendor-Specific Network Protocol" },
1479 { 0x61,
"RTP IPHC Full Header" },
1480 { 0x63,
"RTP IPHC Compressed TCP" },
1481 { 0x65,
"RTP IPHC Compressed non-TCP" },
1482 { 0x67,
"RTP IPHC Compressed UDP 8" },
1483 { 0x69,
"RTP IPHC Compressed RTP 8" },
1484 { 0x6f,
"Stampede Bridging" },
1486 { 0xc1,
"NTCITS IPI" },
1487 { 0xfb,
"single-link compression" },
1488 { 0xfd,
"Compressed Datagram" },
1489 { 0x0201,
"802.1d Hello Packets" },
1490 { 0x0203,
"IBM Source Routing BPDU" },
1491 { 0x0205,
"DEC LANBridge100 Spanning Tree" },
1492 { 0x0207,
"Cisco Discovery Protocol" },
1493 { 0x0209,
"Netcs Twin Routing" },
1494 { 0x020b,
"STP - Scheduled Transfer Protocol" },
1495 { 0x020d,
"EDP - Extreme Discovery Protocol" },
1496 { 0x0211,
"Optical Supervisory Channel Protocol" },
1497 { 0x0213,
"Optical Supervisory Channel Protocol" },
1498 { 0x0231,
"Luxcom" },
1499 { 0x0233,
"Sigma Network Systems" },
1500 { 0x0235,
"Apple Client Server Protocol" },
1501 { 0x0281,
"MPLS Unicast" },
1502 { 0x0283,
"MPLS Multicast" },
1503 { 0x0285,
"IEEE p1284.4 standard - data packets" },
1504 { 0x0287,
"ETSI TETRA Network Protocol Type 1" },
1505 { 0x0289,
"Multichannel Flow Treatment Protocol" },
1506 { 0x2063,
"RTP IPHC Compressed TCP No Delta" },
1507 { 0x2065,
"RTP IPHC Context State" },
1508 { 0x2067,
"RTP IPHC Compressed UDP 16" },
1509 { 0x2069,
"RTP IPHC Compressed RTP 16" },
1510 { 0x4001,
"Cray Communications Control Protocol" },
1511 { 0x4003,
"CDPD Mobile Network Registration Protocol" },
1512 { 0x4005,
"Expand accelerator protocol" },
1513 { 0x4007,
"ODSICP NCP" },
1514 { 0x4009,
"DOCSIS DLL" },
1515 { 0x400B,
"Cetacean Network Detection Protocol" },
1516 { 0x4021,
"Stacker LZS" },
1517 { 0x4023,
"RefTek Protocol" },
1518 { 0x4025,
"Fibre Channel" },
1519 { 0x4027,
"EMIT Protocols" },
1520 { 0x405b,
"Vendor-Specific Protocol (VSP)" },
1521 { 0x8021,
"Internet Protocol Control Protocol" },
1522 { 0x8023,
"OSI Network Layer Control Protocol" },
1523 { 0x8025,
"Xerox NS IDP Control Protocol" },
1524 { 0x8027,
"DECnet Phase IV Control Protocol" },
1525 { 0x8029,
"Appletalk Control Protocol" },
1526 { 0x802b,
"Novell IPX Control Protocol" },
1527 { 0x8031,
"Bridging NCP" },
1528 { 0x8033,
"Stream Protocol Control Protocol" },
1529 { 0x8035,
"Banyan Vines Control Protocol" },
1530 { 0x803d,
"Multi-Link Control Protocol" },
1531 { 0x803f,
"NETBIOS Framing Control Protocol" },
1532 { 0x8041,
"Cisco Systems Control Protocol" },
1533 { 0x8043,
"Ascom Timeplex" },
1534 { 0x8045,
"Fujitsu LBLB Control Protocol" },
1535 { 0x8047,
"DCA Remote Lan Network Control Protocol (RLNCP)" },
1536 { 0x8049,
"Serial Data Control Protocol (PPP-SDCP)" },
1537 { 0x804b,
"SNA over 802.2 Control Protocol" },
1538 { 0x804d,
"SNA Control Protocol" },
1539 { 0x804f,
"IP6 Header Compression Control Protocol" },
1540 { 0x8051,
"KNX Bridging Control Protocol" },
1541 { 0x8053,
"Encryption Control Protocol" },
1542 { 0x8055,
"Individual Link Encryption Control Protocol" },
1543 { 0x8057,
"IPv6 Control Protocol" },
1544 { 0x8059,
"PPP Muxing Control Protocol" },
1545 { 0x805b,
"Vendor-Specific Network Control Protocol (VSNCP)" },
1546 { 0x806f,
"Stampede Bridging Control Protocol" },
1547 { 0x8073,
"MP+ Control Protocol" },
1548 { 0x80c1,
"NTCITS IPI Control Protocol" },
1549 { 0x80fb,
"Single Link Compression Control Protocol" },
1550 { 0x80fd,
"Compression Control Protocol" },
1551 { 0x8207,
"Cisco Discovery Protocol Control" },
1552 { 0x8209,
"Netcs Twin Routing" },
1553 { 0x820b,
"STP - Control Protocol" },
1554 { 0x820d,
"EDPCP - Extreme Discovery Protocol Ctrl Prtcl" },
1555 { 0x8235,
"Apple Client Server Protocol Control" },
1556 { 0x8281,
"MPLSCP" },
1557 { 0x8285,
"IEEE p1284.4 standard - Protocol Control" },
1558 { 0x8287,
"ETSI TETRA TNP1 Control Protocol" },
1559 { 0x8289,
"Multichannel Flow Treatment Protocol" },
1560 { 0xc021,
"Link Control Protocol" },
1561 { 0xc023,
"Password Authentication Protocol" },
1562 { 0xc025,
"Link Quality Report" },
1563 { 0xc027,
"Shiva Password Authentication Protocol" },
1564 { 0xc029,
"CallBack Control Protocol (CBCP)" },
1565 { 0xc02b,
"BACP Bandwidth Allocation Control Protocol" },
1567 { 0xc05b,
"Vendor-Specific Authentication Protocol (VSAP)" },
1568 { 0xc081,
"Container Control Protocol" },
1569 { 0xc223,
"Challenge Handshake Authentication Protocol" },
1570 { 0xc225,
"RSA Authentication Protocol" },
1571 { 0xc227,
"Extensible Authentication Protocol" },
1572 { 0xc229,
"Mitsubishi Security Info Exch Ptcl (SIEP)" },
1573 { 0xc26f,
"Stampede Bridging Authorization Protocol" },
1574 { 0xc281,
"Proprietary Authentication Protocol" },
1575 { 0xc283,
"Proprietary Authentication Protocol" },
1576 { 0xc481,
"Proprietary Node ID Authentication Protocol" },
1583const char * protocol_name(
int proto) {
1584 const struct protocol_list *lp;
1586 for (lp = protocol_list; lp->proto != 0; ++lp) {
1587 if (
proto == lp->proto) {
1595#if PPP_STATS_SUPPORT
1606void reset_link_stats(
int u) {
1607 if (!get_ppp_stats(
u, &old_link_stats)) {
1616void update_link_stats(
int u) {
1623 link_connect_time =
now.tv_sec - start_time.tv_sec;
1624 link_stats_valid = 1;
1626 link_stats.bytes_in -= old_link_stats.bytes_in;
1627 link_stats.bytes_out -= old_link_stats.bytes_out;
1628 link_stats.pkts_in -= old_link_stats.pkts_in;
1629 link_stats.pkts_out -= old_link_stats.pkts_out;
1632void print_link_stats() {
1636 if (link_stats_valid) {
1637 int t = (link_connect_time + 5) / 6;
1638 info(
"Connect time %d.%d minutes.",
t/10,
t%10);
1639 info(
"Sent %u bytes, received %u bytes.", link_stats.bytes_out, link_stats.bytes_in);
1640 link_stats_valid = 0;
#define gettimeofday(tv, tz)
void user(int argc, const char *argv[])
struct protocol * protocols
#define LWIP_ASSERT(message, assertion)
#define MIB2_STATS_NETIF_ADD(n, x, val)
#define MIB2_STATS_NETIF_INC(n, x)
#define MIB2_INIT_NETIF(netif, type, speed)
GLenum const GLvoid * addr
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
#define LWIP_UNUSED_ARG(x)
#define LWIP_ASSERT_CORE_LOCKED()
#define LWIP_MEMPOOL_DECLARE(name, num, size, desc)
#define LWIP_MEMPOOL_ALLOC(name)
#define LWIP_MEMPOOL_INIT(name)
#define LWIP_MEMPOOL_PROTOTYPE(name)
#define LWIP_MEMPOOL_FREE(name, x)
void netif_set_link_down(struct netif *netif)
void netif_remove(struct netif *netif)
struct netif * netif_add(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input)
void netif_set_link_up(struct netif *netif)
void netif_set_up(struct netif *netif)
struct pbuf * pbuf_coalesce(struct pbuf *p, pbuf_layer layer)
u8_t pbuf_free(struct pbuf *p)
#define ip_addr_eq(addr1, addr2)
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)
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out