70#if LWIP_NETIF_LOOPBACK_MULTITHREADING
96#if LWIP_NETIF_STATUS_CALLBACK
97#define NETIF_STATUS_CALLBACK(n) do{ if (n->status_callback) { (n->status_callback)(n); }}while(0)
99#define NETIF_STATUS_CALLBACK(n)
102#if LWIP_NETIF_LINK_CALLBACK
103#define NETIF_LINK_CALLBACK(n) do{ if (n->link_callback) { (n->link_callback)(n); }}while(0)
105#define NETIF_LINK_CALLBACK(n)
108#if LWIP_NETIF_EXT_STATUS_CALLBACK
109static netif_ext_callback_t *ext_callback;
112#if !LWIP_SINGLE_NETIF
117#define netif_index_to_num(index) ((index) - 1)
118static u8_t netif_num;
120#if LWIP_NUM_NETIF_CLIENT_DATA > 0
121static u8_t netif_client_id;
124#define NETIF_REPORT_TYPE_IPV4 0x01
125#define NETIF_REPORT_TYPE_IPV6 0x02
126static void netif_issue_reports(
struct netif *
netif, u8_t report_type);
144static struct netif loop_netif;
147struct netif* netif_get_loopif(
void)
164 LWIP_ASSERT(
"netif_loopif_init: invalid netif",
netif != NULL);
169 MIB2_INIT_NETIF(
netif, snmp_ifType_softwareLoopback, 0);
177 netif->output_ip6 = netif_loop_output_ipv6;
179#if LWIP_LOOPIF_MULTICAST
182 NETIF_SET_CHECKSUM_CTRL(
netif, NETIF_CHECKSUM_DISABLE_ALL);
192#define LOOPIF_ADDRINIT &loop_ipaddr, &loop_netmask, &loop_gw,
193 ip4_addr_t loop_ipaddr, loop_netmask, loop_gw;
195 IP4_ADDR(&loop_ipaddr, 127, 0, 0, 1);
196 IP4_ADDR(&loop_netmask, 255, 0, 0, 0);
198#define LOOPIF_ADDRINIT
202 netif_add(&loop_netif, LOOPIF_ADDRINIT NULL, netif_loopif_init, ip_input);
208 IP_ADDR6_HOST(loop_netif.ip6_addr, 0, 0, 0, 0x00000001UL);
209 loop_netif.ip6_addr_state[0] = IP6_ADDR_VALID;
232 LWIP_ASSERT(
"netif_input: invalid pbuf", p != NULL);
233 LWIP_ASSERT(
"netif_input: invalid netif", inp != NULL);
237 return ethernet_input(p, inp);
240 return ip_input(p, inp);
301 LWIP_ASSERT(
"single netif already set", 0);
306 LWIP_ERROR(
"netif_add: invalid netif",
netif != NULL,
return NULL);
307 LWIP_ERROR(
"netif_add: No init function given", init != NULL,
return NULL);
310 if (ipaddr == NULL) {
313 if (netmask == NULL) {
322 ip_addr_set_zero_ip4(&
netif->netmask);
323 ip_addr_set_zero_ip4(&
netif->gw);
328 ip_addr_set_zero_ip6(&
netif->ip6_addr[i]);
329 netif->ip6_addr_state[i] = IP6_ADDR_INVALID;
330#if LWIP_IPV6_ADDRESS_LIFETIMES
331 netif->ip6_addr_valid_life[i] = IP6_ADDR_LIFE_STATIC;
332 netif->ip6_addr_pref_life[i] = IP6_ADDR_LIFE_STATIC;
335 netif->output_ip6 = netif_null_output_ip6;
337 NETIF_SET_CHECKSUM_CTRL(
netif, NETIF_CHECKSUM_ENABLE_ALL);
340#ifdef netif_get_client_data
341 memset(
netif->client_data, 0,
sizeof(
netif->client_data));
344#if LWIP_IPV6_AUTOCONFIG
346 netif->ip6_autoconfig_enabled = 1;
348 nd6_restart_netif(
netif);
350#if LWIP_NETIF_STATUS_CALLBACK
351 netif->status_callback = NULL;
353#if LWIP_NETIF_LINK_CALLBACK
354 netif->link_callback = NULL;
357 netif->igmp_mac_filter = NULL;
359#if LWIP_IPV6 && LWIP_IPV6_MLD
360 netif->mld_mac_filter = NULL;
369 netif->acd_list = NULL;
371 NETIF_RESET_HINTS(
netif);
373 netif->loop_first = NULL;
374 netif->loop_last = NULL;
375#if LWIP_LOOPBACK_MAX_PBUFS
376 netif->loop_cnt_current = 0;
378#if LWIP_NETIF_LOOPBACK_MULTITHREADING
379 netif->reschedule_poll = 0;
384 netif_set_addr(
netif, ipaddr, netmask, gw);
391#if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES
397#if !LWIP_SINGLE_NETIF
404 struct netif *netif2;
411 for (netif2 =
netif_list; netif2 != NULL; netif2 = netif2->
next) {
412 LWIP_ASSERT(
"netif already added", netif2 !=
netif);
414 LWIP_ASSERT(
"too many netifs, max. supported number is 255", num_netifs <= 255);
420 }
while (netif2 != NULL);
432 mib2_netif_added(
netif);
441 LWIP_DEBUGF(
NETIF_DEBUG, (
"netif: added interface %c%c IP",
459netif_do_ip_addr_changed(
const ip_addr_t *old_addr,
const ip_addr_t *new_addr)
462 tcp_netif_ip_addr_changed(old_addr, new_addr);
465 udp_netif_ip_addr_changed(old_addr, new_addr);
468 raw_netif_ip_addr_changed(old_addr, new_addr);
476 LWIP_ASSERT(
"invalid pointer", ipaddr != NULL);
477 LWIP_ASSERT(
"invalid pointer", old_addr != NULL);
480 if (ip4_addr_eq(ipaddr, netif_ip4_addr(
netif)) == 0) {
482 *ip_2_ip4(&new_addr) = *ipaddr;
485 ip_addr_copy(*old_addr, *netif_ip_addr4(
netif));
488 netif_do_ip_addr_changed(old_addr, &new_addr);
491 acd_netif_ip_addr_changed(
netif, old_addr, &new_addr);
494 mib2_remove_ip4(
netif);
495 mib2_remove_route_ip4(0,
netif);
500 mib2_add_route_ip4(0,
netif);
502 netif_issue_reports(
netif, NETIF_REPORT_TYPE_IPV4);
504 NETIF_STATUS_CALLBACK(
netif);
525 LWIP_ERROR(
"netif_set_ipaddr: invalid netif",
netif != NULL,
return);
528 if (ipaddr == NULL) {
534 if (netif_do_set_ipaddr(
netif, ipaddr, &old_addr)) {
535#if LWIP_NETIF_EXT_STATUS_CALLBACK
547 if (ip4_addr_eq(netmask, netif_ip4_netmask(
netif)) == 0) {
548#if LWIP_NETIF_EXT_STATUS_CALLBACK
549 LWIP_ASSERT(
"invalid pointer", old_nm != NULL);
550 ip_addr_copy(*old_nm, *netif_ip_netmask4(
netif));
554 mib2_remove_route_ip4(0,
netif);
558 mib2_add_route_ip4(0,
netif);
561 ip4_addr1_16(netif_ip4_netmask(
netif)),
562 ip4_addr2_16(netif_ip4_netmask(
netif)),
563 ip4_addr3_16(netif_ip4_netmask(
netif)),
564 ip4_addr4_16(netif_ip4_netmask(
netif))));
583#if LWIP_NETIF_EXT_STATUS_CALLBACK
584 ip_addr_t old_nm_val;
585 ip_addr_t *old_nm = &old_nm_val;
587 ip_addr_t *old_nm = NULL;
591 LWIP_ERROR(
"netif_set_netmask: invalid netif",
netif != NULL,
return);
594 if (netmask == NULL) {
598 if (netif_do_set_netmask(
netif, netmask, old_nm)) {
599#if LWIP_NETIF_EXT_STATUS_CALLBACK
601 args.ipv4_changed.old_netmask = old_nm;
611 if (ip4_addr_eq(gw, netif_ip4_gw(
netif)) == 0) {
612#if LWIP_NETIF_EXT_STATUS_CALLBACK
613 LWIP_ASSERT(
"invalid pointer", old_gw != NULL);
614 ip_addr_copy(*old_gw, *netif_ip_gw4(
netif));
623 ip4_addr1_16(netif_ip4_gw(
netif)),
624 ip4_addr2_16(netif_ip4_gw(
netif)),
625 ip4_addr3_16(netif_ip4_gw(
netif)),
626 ip4_addr4_16(netif_ip4_gw(
netif))));
644#if LWIP_NETIF_EXT_STATUS_CALLBACK
645 ip_addr_t old_gw_val;
646 ip_addr_t *old_gw = &old_gw_val;
648 ip_addr_t *old_gw = NULL;
652 LWIP_ERROR(
"netif_set_gw: invalid netif",
netif != NULL,
return);
659 if (netif_do_set_gw(
netif, gw, old_gw)) {
660#if LWIP_NETIF_EXT_STATUS_CALLBACK
662 args.ipv4_changed.old_gw = old_gw;
682#if LWIP_NETIF_EXT_STATUS_CALLBACK
685 ip_addr_t old_nm_val;
686 ip_addr_t old_gw_val;
687 ip_addr_t *old_nm = &old_nm_val;
688 ip_addr_t *old_gw = &old_gw_val;
690 ip_addr_t *old_nm = NULL;
691 ip_addr_t *old_gw = NULL;
699 if (ipaddr == NULL) {
702 if (netmask == NULL) {
709 remove = ip4_addr_isany(ipaddr);
713 if (netif_do_set_ipaddr(
netif, ipaddr, &old_addr)) {
714#if LWIP_NETIF_EXT_STATUS_CALLBACK
720 if (netif_do_set_netmask(
netif, netmask, old_nm)) {
721#if LWIP_NETIF_EXT_STATUS_CALLBACK
723 cb_args.ipv4_changed.old_netmask = old_nm;
726 if (netif_do_set_gw(
netif, gw, old_gw)) {
727#if LWIP_NETIF_EXT_STATUS_CALLBACK
729 cb_args.ipv4_changed.old_gw = old_gw;
734 if (netif_do_set_ipaddr(
netif, ipaddr, &old_addr)) {
735#if LWIP_NETIF_EXT_STATUS_CALLBACK
742#if LWIP_NETIF_EXT_STATUS_CALLBACK
743 if (change_reason != LWIP_NSC_NONE) {
750 if (change_reason != LWIP_NSC_NONE) {
751 netif_invoke_ext_callback(
netif, change_reason, &cb_args);
779 if (!ip4_addr_isany_val(*netif_ip4_addr(
netif))) {
780 netif_do_ip_addr_changed(netif_ip_addr4(
netif), NULL);
793 if (ip6_addr_isvalid(netif_ip6_addr_state(
netif, i))) {
794 netif_do_ip_addr_changed(netif_ip_addr6(
netif, i), NULL);
807 mib2_remove_ip4(
netif);
814#if !LWIP_SINGLE_NETIF
820 struct netif *tmp_netif;
821 NETIF_FOREACH(tmp_netif) {
827 if (tmp_netif == NULL) {
832 mib2_netif_removed(
netif);
833#if LWIP_NETIF_REMOVE_CALLBACK
834 if (
netif->remove_callback) {
838 LWIP_DEBUGF(
NETIF_DEBUG, (
"netif_remove: removed netif\n") );
855 mib2_remove_route_ip4(1,
netif);
858 mib2_add_route_ip4(1,
netif);
861 LWIP_DEBUGF(
NETIF_DEBUG, (
"netif: setting default interface %c%c\n",
875 LWIP_ERROR(
"netif_set_up: invalid netif",
netif != NULL,
return);
880 MIB2_COPY_SYSUPTIME_TO(&
netif->ts);
882 NETIF_STATUS_CALLBACK(
netif);
884#if LWIP_NETIF_EXT_STATUS_CALLBACK
887 args.status_changed.
state = 1;
892 netif_issue_reports(
netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
894 nd6_restart_netif(
netif);
902netif_issue_reports(
struct netif *
netif, u8_t report_type)
904 LWIP_ASSERT(
"netif_issue_reports: invalid netif",
netif != NULL);
913 if ((report_type & NETIF_REPORT_TYPE_IPV4) &&
914 !ip4_addr_isany_val(*netif_ip4_addr(
netif))) {
915#if LWIP_ARP && !LWIP_ACD
921 etharp_gratuitous(
netif);
928 igmp_report_groups(
netif);
935 if (report_type & NETIF_REPORT_TYPE_IPV6) {
938 mld6_report_groups(
netif);
953 LWIP_ERROR(
"netif_set_down: invalid netif",
netif != NULL,
return);
956#if LWIP_NETIF_EXT_STATUS_CALLBACK
959 args.status_changed.
state = 0;
965 MIB2_COPY_SYSUPTIME_TO(&
netif->ts);
967#if LWIP_IPV4 && LWIP_ARP
969 etharp_cleanup_netif(
netif);
974 nd6_cleanup_netif(
netif);
977 NETIF_STATUS_CALLBACK(
netif);
981#if LWIP_NETIF_STATUS_CALLBACK
992 netif->status_callback = status_callback;
997#if LWIP_NETIF_REMOVE_CALLBACK
1008 netif->remove_callback = remove_callback;
1022 LWIP_ERROR(
"netif_set_link_up: invalid netif",
netif != NULL,
return);
1028 dhcp_network_changed_link_up(
netif);
1032 autoip_network_changed_link_up(
netif);
1035 netif_issue_reports(
netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
1037 nd6_restart_netif(
netif);
1040 NETIF_LINK_CALLBACK(
netif);
1041#if LWIP_NETIF_EXT_STATUS_CALLBACK
1044 args.link_changed.
state = 1;
1060 LWIP_ERROR(
"netif_set_link_down: invalid netif",
netif != NULL,
return);
1066 autoip_network_changed_link_down(
netif);
1070 acd_network_changed_link_down(
netif);
1073#if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES
1077 NETIF_LINK_CALLBACK(
netif);
1078#if LWIP_NETIF_EXT_STATUS_CALLBACK
1081 args.link_changed.
state = 0;
1088#if LWIP_NETIF_LINK_CALLBACK
1099 netif->link_callback = link_callback;
1126#if LWIP_LOOPBACK_MAX_PBUFS
1133 struct netif *stats_if = &loop_netif;
1138#if LWIP_NETIF_LOOPBACK_MULTITHREADING
1139 u8_t schedule_poll = 0;
1143 LWIP_ASSERT(
"netif_loop_output: invalid netif",
netif != NULL);
1144 LWIP_ASSERT(
"netif_loop_output: invalid pbuf", p != NULL);
1149 LINK_STATS_INC(link.memerr);
1150 LINK_STATS_INC(link.drop);
1151 MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);
1154#if LWIP_LOOPBACK_MAX_PBUFS
1155 clen = pbuf_clen(r);
1157 if (((
netif->loop_cnt_current + clen) <
netif->loop_cnt_current) ||
1158 ((
netif->loop_cnt_current + clen) > LWIP_MIN(LWIP_LOOPBACK_MAX_PBUFS, 0xFFFF))) {
1160 LINK_STATS_INC(link.memerr);
1161 LINK_STATS_INC(link.drop);
1162 MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);
1165 netif->loop_cnt_current = (u16_t)(
netif->loop_cnt_current + clen);
1171 LINK_STATS_INC(link.memerr);
1172 LINK_STATS_INC(link.drop);
1173 MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);
1181 for (last = r; last->
next != NULL; last = last->
next) {
1185 SYS_ARCH_PROTECT(lev);
1186 if (
netif->loop_first != NULL) {
1187 LWIP_ASSERT(
"if first != NULL, last must also be != NULL",
netif->loop_last != NULL);
1189 netif->loop_last = last;
1190#if LWIP_NETIF_LOOPBACK_MULTITHREADING
1191 if (
netif->reschedule_poll) {
1193 netif->reschedule_poll = 0;
1197 netif->loop_first = r;
1198 netif->loop_last = last;
1199#if LWIP_NETIF_LOOPBACK_MULTITHREADING
1204 SYS_ARCH_UNPROTECT(lev);
1206 LINK_STATS_INC(link.xmit);
1207 MIB2_STATS_NETIF_ADD(stats_if, ifoutoctets, p->tot_len);
1208 MIB2_STATS_NETIF_INC(stats_if, ifoutucastpkts);
1210#if LWIP_NETIF_LOOPBACK_MULTITHREADING
1212 if (schedule_poll) {
1214 SYS_ARCH_PROTECT(lev);
1215 netif->reschedule_poll = 1;
1216 SYS_ARCH_UNPROTECT(lev);
1230 return netif_loop_output(
netif, p);
1239 return netif_loop_output(
netif, p);
1258 struct netif *stats_if = &loop_netif;
1265 LWIP_ASSERT(
"netif_poll: invalid netif",
netif != NULL);
1268 SYS_ARCH_PROTECT(lev);
1269 while (
netif->loop_first != NULL) {
1270 struct pbuf *in, *in_end;
1271#if LWIP_LOOPBACK_MAX_PBUFS
1275 in = in_end =
netif->loop_first;
1277 LWIP_ASSERT(
"bogus pbuf: len != tot_len but next == NULL!", in_end->
next != NULL);
1278 in_end = in_end->
next;
1279#if LWIP_LOOPBACK_MAX_PBUFS
1283#if LWIP_LOOPBACK_MAX_PBUFS
1285 LWIP_ASSERT(
"netif->loop_cnt_current underflow",
1286 ((
netif->loop_cnt_current - clen) <
netif->loop_cnt_current));
1287 netif->loop_cnt_current = (u16_t)(
netif->loop_cnt_current - clen);
1291 if (in_end ==
netif->loop_last) {
1297 LWIP_ASSERT(
"should not be null since first != last!",
netif->loop_first != NULL);
1300 in_end->
next = NULL;
1301 SYS_ARCH_UNPROTECT(lev);
1303 in->if_idx = netif_get_index(
netif);
1305 LINK_STATS_INC(link.recv);
1306 MIB2_STATS_NETIF_ADD(stats_if, ifinoctets, in->tot_len);
1307 MIB2_STATS_NETIF_INC(stats_if, ifinucastpkts);
1312 SYS_ARCH_PROTECT(lev);
1314 SYS_ARCH_UNPROTECT(lev);
1317#if !LWIP_NETIF_LOOPBACK_MULTITHREADING
1326 NETIF_FOREACH(
netif) {
1333#if LWIP_NUM_NETIF_CLIENT_DATA > 0
1341netif_alloc_client_data_id(
void)
1343 u8_t result = netif_client_id;
1348#if LWIP_NUM_NETIF_CLIENT_DATA > 256
1349#error LWIP_NUM_NETIF_CLIENT_DATA must be <= 256
1351 LWIP_ASSERT(
"Increase LWIP_NUM_NETIF_CLIENT_DATA in lwipopts.h", result < LWIP_NUM_NETIF_CLIENT_DATA);
1352 return (u8_t)(result + LWIP_NETIF_CLIENT_DATA_INDEX_MAX);
1372 LWIP_ASSERT(
"netif_ip6_addr_set: invalid netif",
netif != NULL);
1373 LWIP_ASSERT(
"netif_ip6_addr_set: invalid addr6", addr6 != NULL);
1375 netif_ip6_addr_set_parts(
netif, addr_idx, addr6->addr[0], addr6->addr[1],
1376 addr6->addr[2], addr6->addr[3]);
1390netif_ip6_addr_set_parts(
struct netif *
netif, s8_t addr_idx, u32_t i0, u32_t i1, u32_t i2, u32_t i3)
1393 ip_addr_t new_ipaddr;
1395 LWIP_ASSERT(
"netif != NULL",
netif != NULL);
1402 if ((ip_2_ip6(&old_addr)->addr[0] != i0) || (ip_2_ip6(&old_addr)->addr[1] != i1) ||
1403 (ip_2_ip6(&old_addr)->addr[2] != i2) || (ip_2_ip6(&old_addr)->addr[3] != i3)) {
1406 IP_ADDR6(&new_ipaddr, i0, i1, i2, i3);
1407 ip6_addr_assign_zone(ip_2_ip6(&new_ipaddr), IP6_UNICAST,
netif);
1409 if (ip6_addr_isvalid(netif_ip6_addr_state(
netif, addr_idx))) {
1410 netif_do_ip_addr_changed(netif_ip_addr6(
netif, addr_idx), &new_ipaddr);
1414 ip_addr_copy(
netif->ip6_addr[addr_idx], new_ipaddr);
1416 if (ip6_addr_isvalid(netif_ip6_addr_state(
netif, addr_idx))) {
1417 netif_issue_reports(
netif, NETIF_REPORT_TYPE_IPV6);
1418 NETIF_STATUS_CALLBACK(
netif);
1421#if LWIP_NETIF_EXT_STATUS_CALLBACK
1425 args.ipv6_set.old_address = &old_addr;
1433 netif_ip6_addr_state(
netif, addr_idx)));
1447netif_ip6_addr_set_state(
struct netif *
netif, s8_t addr_idx, u8_t
state)
1451 LWIP_ASSERT(
"netif != NULL",
netif != NULL);
1454 old_state = netif_ip6_addr_state(
netif, addr_idx);
1456 if (old_state !=
state) {
1457 u8_t old_valid = old_state & IP6_ADDR_VALID;
1458 u8_t new_valid =
state & IP6_ADDR_VALID;
1464 nd6_adjust_mld_membership(
netif, addr_idx,
state);
1468 if (old_valid && !new_valid) {
1470 netif_do_ip_addr_changed(netif_ip_addr6(
netif, addr_idx), NULL);
1475 if (!old_valid && new_valid) {
1478 IP6_ADDR_ZONECHECK_NETIF(netif_ip6_addr(
netif, addr_idx),
netif);
1480 netif_issue_reports(
netif, NETIF_REPORT_TYPE_IPV6);
1482 if ((old_state & ~IP6_ADDR_TENTATIVE_COUNT_MASK) !=
1483 (
state & ~IP6_ADDR_TENTATIVE_COUNT_MASK)) {
1485 NETIF_STATUS_CALLBACK(
netif);
1488#if LWIP_NETIF_EXT_STATUS_CALLBACK
1491 args.ipv6_addr_state_changed.
addr_index = addr_idx;
1492 args.ipv6_addr_state_changed.old_state = old_state;
1493 args.ipv6_addr_state_changed.address = netif_ip_addr6(
netif, addr_idx);
1500 netif_ip6_addr_state(
netif, addr_idx)));
1524 LWIP_ASSERT(
"netif_get_ip6_addr_match: invalid netif",
netif != NULL);
1525 LWIP_ASSERT(
"netif_get_ip6_addr_match: invalid ip6addr", ip6addr != NULL);
1528 if (ip6_addr_has_zone(ip6addr) && !ip6_addr_test_zone(ip6addr,
netif)) {
1534 if (!ip6_addr_isinvalid(netif_ip6_addr_state(
netif, i)) &&
1535 ip6_addr_zoneless_eq(netif_ip6_addr(
netif, i), ip6addr)) {
1551netif_create_ip6_linklocal_address(
struct netif *
netif, u8_t from_mac_48bit)
1557 LWIP_ASSERT(
"netif_create_ip6_linklocal_address: invalid netif",
netif != NULL);
1560 ip_2_ip6(&
netif->ip6_addr[0])->addr[0] = PP_HTONL(0xfe800000ul);
1561 ip_2_ip6(&
netif->ip6_addr[0])->addr[1] = 0;
1564 if (from_mac_48bit) {
1566 ip_2_ip6(&
netif->ip6_addr[0])->addr[2] = lwip_htonl((((u32_t)(
netif->
hwaddr[0] ^ 0x02)) << 24) |
1570 ip_2_ip6(&
netif->ip6_addr[0])->addr[3] = lwip_htonl((u32_t)(0xfeul << 24) |
1576 ip_2_ip6(&
netif->ip6_addr[0])->addr[2] = 0;
1577 ip_2_ip6(&
netif->ip6_addr[0])->addr[3] = 0;
1596 ip6_addr_assign_zone(ip_2_ip6(&
netif->ip6_addr[0]), IP6_UNICAST,
netif);
1599#if LWIP_IPV6_DUP_DETECT_ATTEMPTS
1601 netif_ip6_addr_set_state(
netif, 0, IP6_ADDR_TENTATIVE);
1604 netif_ip6_addr_set_state(
netif, 0, IP6_ADDR_PREFERRED);
1625 LWIP_ASSERT(
"netif_add_ip6_address: invalid netif",
netif != NULL);
1626 LWIP_ASSERT(
"netif_add_ip6_address: invalid ip6addr", ip6addr != NULL);
1628 i = netif_get_ip6_addr_match(
netif, ip6addr);
1631 if (chosen_idx != NULL) {
1639 if (ip6_addr_isinvalid(netif_ip6_addr_state(
netif, i))) {
1640 ip_addr_copy_from_ip6(
netif->ip6_addr[i], *ip6addr);
1641 ip6_addr_assign_zone(ip_2_ip6(&
netif->ip6_addr[i]), IP6_UNICAST,
netif);
1642 netif_ip6_addr_set_state(
netif, i, IP6_ADDR_TENTATIVE);
1643 if (chosen_idx != NULL) {
1650 if (chosen_idx != NULL) {
1694 if (
netif != NULL) {
1695 return netif_get_index(
netif);
1698 return NETIF_NO_INDEX;
1714 if (
netif != NULL) {
1736 if (idx != NETIF_NO_INDEX) {
1737 NETIF_FOREACH(
netif) {
1738 if (idx == netif_get_index(
netif)) {
1766 num = (u8_t)atoi(&name[2]);
1767 if (!
num && (name[2] !=
'0')) {
1772 NETIF_FOREACH(
netif) {
1776 LWIP_DEBUGF(
NETIF_DEBUG, (
"netif_find: found %c%c\n", name[0], name[1]));
1780 LWIP_DEBUGF(
NETIF_DEBUG, (
"netif_find: didn't find %c%c\n", name[0], name[1]));
1784#if LWIP_NETIF_EXT_STATUS_CALLBACK
1795 LWIP_ASSERT(
"callback must be != NULL", callback != NULL);
1796 LWIP_ASSERT(
"fn must be != NULL", fn != NULL);
1798 callback->callback_fn = fn;
1799 callback->next = ext_callback;
1800 ext_callback = callback;
1809netif_remove_ext_callback(netif_ext_callback_t* callback)
1811 netif_ext_callback_t *last, *iter;
1814 LWIP_ASSERT(
"callback must be != NULL", callback != NULL);
1816 if (ext_callback == NULL) {
1820 if (callback == ext_callback) {
1821 ext_callback = ext_callback->next;
1823 last = ext_callback;
1824 for (iter = ext_callback->next; iter != NULL; last = iter, iter = iter->next) {
1825 if (iter == callback) {
1826 LWIP_ASSERT(
"last != NULL", last != NULL);
1827 last->next = callback->next;
1832 callback->next = NULL;
1844 netif_ext_callback_t *callback = ext_callback;
1846 LWIP_ASSERT(
"netif must be != NULL",
netif != NULL);
1848 while (callback != NULL) {
1850 netif_ext_callback_t *next = callback->next;
1851 callback->callback_fn(
netif, reason, args);
struct netif * netif_list
#define ip4_addr_set(dest, src)
void(*) netif_status_callback_fn(struct netif *netif)
struct netif * netif_default
#define IP4_ADDR(ipaddr, a, b, c, d)
err_t(*) netif_input_fn(struct pbuf *p, struct netif *inp)
#define ip6_addr_copy(dest, src)
struct ip6_addr ip6_addr_t
err_t(*) netif_init_fn(struct netif *netif)
#define LWIP_UNUSED_ARG(x)
err_t netif_input(struct pbuf *p, struct netif *inp)
err_t tcpip_input(struct pbuf *p, struct netif *inp)
err_t tcpip_try_callback(tcpip_callback_fn function, void *ctx)
#define LWIP_IPV6_NUM_ADDRESSES
#define LWIP_ASSERT_CORE_LOCKED()
#define NETIF_FLAG_LINK_UP
#define NETIF_FLAG_ETHERNET
#define NETIF_FLAG_ETHARP
char * netif_index_to_name(u8_t idx, char *name)
void(*) netif_ext_callback_fn(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args)
void netif_set_link_down(struct netif *netif)
struct netif * netif_find(const char *name)
void netif_set_down(struct netif *netif)
#define netif_is_up(netif)
void netif_remove(struct netif *netif)
struct netif * netif_get_by_index(u8_t idx)
struct netif * netif_add(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input)
u8_t netif_name_to_index(const char *name)
void netif_set_default(struct netif *netif)
void netif_set_link_up(struct netif *netif)
void netif_set_up(struct netif *netif)
struct netif * netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input)
u8 pbuf_free(struct pbuf *p)
err_t pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from)
void lwip_itoa(char *result, size_t bufsize, int number)
#define LWIP_NSC_IPV6_ADDR_STATE_CHANGED
#define LWIP_NSC_IPV4_GATEWAY_CHANGED
#define LWIP_NSC_IPV4_SETTINGS_CHANGED
#define LWIP_NSC_LINK_CHANGED
#define LWIP_NSC_STATUS_CHANGED
#define LWIP_NSC_IPV4_ADDR_VALID
#define LWIP_NSC_IPV6_SET
#define LWIP_NSC_IPV4_NETMASK_CHANGED
#define LWIP_NSC_NETIF_ADDED
#define LWIP_NSC_NETIF_REMOVED
#define LWIP_NSC_IPV4_ADDRESS_CHANGED
void(*) tcpip_callback_fn(void *ctx)
struct ip4_addr ip4_addr_t
const ip_addr_t * old_address
u8 hwaddr[NETIF_MAX_HWADDR_LEN]
#define SYS_ARCH_DECL_PROTECT(lev)