00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "lwip/opt.h"
00042 #include "lwip/ip.h"
00043 #include "lwip/def.h"
00044 #include "lwip/mem.h"
00045 #include "lwip/ip_frag.h"
00046 #include "lwip/inet.h"
00047 #include "lwip/inet_chksum.h"
00048 #include "lwip/netif.h"
00049 #include "lwip/icmp.h"
00050 #include "lwip/igmp.h"
00051 #include "lwip/raw.h"
00052 #include "lwip/udp.h"
00053 #include "lwip/tcp.h"
00054 #include "lwip/snmp.h"
00055 #include "lwip/dhcp.h"
00056 #include "lwip/stats.h"
00057 #include "arch/perf.h"
00058
00059 #include <string.h>
00060
00061
00062
00063
00064
00065 struct netif *current_netif;
00066
00067
00068
00069
00070 const struct ip_hdr *current_header;
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 struct netif *
00082 ip_route(struct ip_addr *dest)
00083 {
00084 struct netif *netif;
00085
00086
00087 for(netif = netif_list; netif != NULL; netif = netif->next) {
00088
00089 if (netif_is_up(netif)) {
00090 if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
00091
00092 return netif;
00093 }
00094 }
00095 }
00096 if ((netif_default == NULL) || (!netif_is_up(netif_default))) {
00097 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to 0x%"X32_F"\n", dest->addr));
00098 IP_STATS_INC(ip.rterr);
00099 snmp_inc_ipoutnoroutes();
00100 return NULL;
00101 }
00102
00103 return netif_default;
00104 }
00105
00106 #if IP_FORWARD
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 static struct netif *
00118 ip_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp)
00119 {
00120 struct netif *netif;
00121
00122 PERF_START;
00123
00124 netif = ip_route((struct ip_addr *)&(iphdr->dest));
00125 if (netif == NULL) {
00126 LWIP_DEBUGF(IP_DEBUG, ("ip_forward: no forwarding route for 0x%"X32_F" found\n",
00127 iphdr->dest.addr));
00128 snmp_inc_ipoutnoroutes();
00129 return (struct netif *)NULL;
00130 }
00131
00132
00133 if (netif == inp) {
00134 LWIP_DEBUGF(IP_DEBUG, ("ip_forward: not bouncing packets back on incoming interface.\n"));
00135 snmp_inc_ipoutnoroutes();
00136 return (struct netif *)NULL;
00137 }
00138
00139
00140 IPH_TTL_SET(iphdr, IPH_TTL(iphdr) - 1);
00141
00142 if (IPH_TTL(iphdr) == 0) {
00143 snmp_inc_ipinhdrerrors();
00144 #if LWIP_ICMP
00145
00146 if (IPH_PROTO(iphdr) != IP_PROTO_ICMP) {
00147 icmp_time_exceeded(p, ICMP_TE_TTL);
00148 }
00149 #endif
00150 return (struct netif *)NULL;
00151 }
00152
00153
00154 if (IPH_CHKSUM(iphdr) >= htons(0xffff - 0x100)) {
00155 IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + htons(0x100) + 1);
00156 } else {
00157 IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + htons(0x100));
00158 }
00159
00160 LWIP_DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to 0x%"X32_F"\n",
00161 iphdr->dest.addr));
00162
00163 IP_STATS_INC(ip.fw);
00164 IP_STATS_INC(ip.xmit);
00165 snmp_inc_ipforwdatagrams();
00166
00167 PERF_STOP("ip_forward");
00168
00169 netif->output(netif, p, (struct ip_addr *)&(iphdr->dest));
00170 return netif;
00171 }
00172 #endif
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 err_t
00189 ip_input(struct pbuf *p, struct netif *inp)
00190 {
00191 struct ip_hdr *iphdr;
00192 struct netif *netif;
00193 u16_t iphdr_hlen;
00194 u16_t iphdr_len;
00195 #if LWIP_DHCP
00196 int check_ip_src=1;
00197 #endif
00198
00199 IP_STATS_INC(ip.recv);
00200 snmp_inc_ipinreceives();
00201
00202
00203 iphdr = p->payload;
00204 if (IPH_V(iphdr) != 4) {
00205 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr)));
00206 ip_debug_print(p);
00207 pbuf_free(p);
00208 IP_STATS_INC(ip.err);
00209 IP_STATS_INC(ip.drop);
00210 snmp_inc_ipinhdrerrors();
00211 return ERR_OK;
00212 }
00213
00214
00215 iphdr_hlen = IPH_HL(iphdr);
00216
00217 iphdr_hlen *= 4;
00218
00219 iphdr_len = ntohs(IPH_LEN(iphdr));
00220
00221
00222 if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
00223 if (iphdr_hlen > p->len) {
00224 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
00225 ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n",
00226 iphdr_hlen, p->len));
00227 }
00228 if (iphdr_len > p->tot_len) {
00229 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
00230 ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
00231 iphdr_len, p->tot_len));
00232 }
00233
00234 pbuf_free(p);
00235 IP_STATS_INC(ip.lenerr);
00236 IP_STATS_INC(ip.drop);
00237 snmp_inc_ipindiscards();
00238 return ERR_OK;
00239 }
00240
00241
00242 #if CHECKSUM_CHECK_IP
00243 if (inet_chksum(iphdr, iphdr_hlen) != 0) {
00244
00245 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
00246 ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen)));
00247 ip_debug_print(p);
00248 pbuf_free(p);
00249 IP_STATS_INC(ip.chkerr);
00250 IP_STATS_INC(ip.drop);
00251 snmp_inc_ipinhdrerrors();
00252 return ERR_OK;
00253 }
00254 #endif
00255
00256
00257
00258 pbuf_realloc(p, iphdr_len);
00259
00260
00261 #if LWIP_IGMP
00262 if (ip_addr_ismulticast(&(iphdr->dest))) {
00263 if ((inp->flags & NETIF_FLAG_IGMP) && (igmp_lookfor_group(inp, &(iphdr->dest)))) {
00264 netif = inp;
00265 } else {
00266 netif = NULL;
00267 }
00268 } else
00269 #endif
00270 {
00271
00272
00273
00274 int first = 1;
00275 netif = inp;
00276 do {
00277 LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n",
00278 iphdr->dest.addr, netif->ip_addr.addr,
00279 iphdr->dest.addr & netif->netmask.addr,
00280 netif->ip_addr.addr & netif->netmask.addr,
00281 iphdr->dest.addr & ~(netif->netmask.addr)));
00282
00283
00284 if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) {
00285
00286 if (ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr)) ||
00287
00288 ip_addr_isbroadcast(&(iphdr->dest), netif)) {
00289 LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface %c%c\n",
00290 netif->name[0], netif->name[1]));
00291
00292 break;
00293 }
00294 }
00295 if (first) {
00296 first = 0;
00297 netif = netif_list;
00298 } else {
00299 netif = netif->next;
00300 }
00301 if (netif == inp) {
00302 netif = netif->next;
00303 }
00304 } while(netif != NULL);
00305 }
00306
00307 #if LWIP_DHCP
00308
00309
00310
00311
00312 if (netif == NULL) {
00313
00314 if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
00315 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n",
00316 ntohs(((struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen))->dest)));
00317 if (ntohs(((struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen))->dest) == DHCP_CLIENT_PORT) {
00318 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: DHCP packet accepted.\n"));
00319 netif = inp;
00320 check_ip_src = 0;
00321 }
00322 }
00323 }
00324 #endif
00325
00326
00327 #if LWIP_DHCP
00328
00329 if (check_ip_src && (iphdr->src.addr != 0))
00330 #endif
00331 { if ((ip_addr_isbroadcast(&(iphdr->src), inp)) ||
00332 (ip_addr_ismulticast(&(iphdr->src)))) {
00333
00334 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip_input: packet source is not valid.\n"));
00335
00336 pbuf_free(p);
00337 IP_STATS_INC(ip.drop);
00338 snmp_inc_ipinaddrerrors();
00339 snmp_inc_ipindiscards();
00340 return ERR_OK;
00341 }
00342 }
00343
00344
00345 if (netif == NULL) {
00346
00347 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n"));
00348 #if IP_FORWARD
00349
00350 if (!ip_addr_isbroadcast(&(iphdr->dest), inp)) {
00351
00352 ip_forward(p, iphdr, inp);
00353 } else
00354 #endif
00355 {
00356 snmp_inc_ipinaddrerrors();
00357 snmp_inc_ipindiscards();
00358 }
00359 pbuf_free(p);
00360 return ERR_OK;
00361 }
00362
00363 if ((IPH_OFFSET(iphdr) & htons(IP_OFFMASK | IP_MF)) != 0) {
00364 #if IP_REASSEMBLY
00365 LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip_reass()\n",
00366 ntohs(IPH_ID(iphdr)), p->tot_len, ntohs(IPH_LEN(iphdr)), !!(IPH_OFFSET(iphdr) & htons(IP_MF)), (ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8));
00367
00368 p = ip_reass(p);
00369
00370 if (p == NULL) {
00371 return ERR_OK;
00372 }
00373 iphdr = p->payload;
00374 #else
00375 pbuf_free(p);
00376 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n",
00377 ntohs(IPH_OFFSET(iphdr))));
00378 IP_STATS_INC(ip.opterr);
00379 IP_STATS_INC(ip.drop);
00380
00381 snmp_inc_ipinunknownprotos();
00382 return ERR_OK;
00383 #endif
00384 }
00385
00386 #if IP_OPTIONS_ALLOWED == 0
00387
00388 #if LWIP_IGMP
00389
00390 if((iphdr_hlen > IP_HLEN && (IPH_PROTO(iphdr) != IP_PROTO_IGMP)) {
00391 #else
00392 if (iphdr_hlen > IP_HLEN) {
00393 #endif
00394 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since there were IP options (while IP_OPTIONS_ALLOWED == 0).\n"));
00395 pbuf_free(p);
00396 IP_STATS_INC(ip.opterr);
00397 IP_STATS_INC(ip.drop);
00398
00399 snmp_inc_ipinunknownprotos();
00400 return ERR_OK;
00401 }
00402 #endif
00403
00404
00405 LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n"));
00406 ip_debug_print(p);
00407 LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
00408
00409 current_netif = inp;
00410 current_header = iphdr;
00411
00412 #if LWIP_RAW
00413
00414 if (raw_input(p, inp) == 0)
00415 #endif
00416 {
00417
00418 switch (IPH_PROTO(iphdr)) {
00419 #if LWIP_UDP
00420 case IP_PROTO_UDP:
00421 #if LWIP_UDPLITE
00422 case IP_PROTO_UDPLITE:
00423 #endif
00424 snmp_inc_ipindelivers();
00425 udp_input(p, inp);
00426 break;
00427 #endif
00428 #if LWIP_TCP
00429 case IP_PROTO_TCP:
00430 snmp_inc_ipindelivers();
00431 tcp_input(p, inp);
00432 break;
00433 #endif
00434 #if LWIP_ICMP
00435 case IP_PROTO_ICMP:
00436 snmp_inc_ipindelivers();
00437 icmp_input(p, inp);
00438 break;
00439 #endif
00440 #if LWIP_IGMP
00441 case IP_PROTO_IGMP:
00442 igmp_input(p,inp,&(iphdr->dest));
00443 break;
00444 #endif
00445 default:
00446 #if LWIP_ICMP
00447
00448 if (!ip_addr_isbroadcast(&(iphdr->dest), inp) &&
00449 !ip_addr_ismulticast(&(iphdr->dest))) {
00450 p->payload = iphdr;
00451 icmp_dest_unreach(p, ICMP_DUR_PROTO);
00452 }
00453 #endif
00454 pbuf_free(p);
00455
00456 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr)));
00457
00458 IP_STATS_INC(ip.proterr);
00459 IP_STATS_INC(ip.drop);
00460 snmp_inc_ipinunknownprotos();
00461 }
00462 }
00463
00464 current_netif = NULL;
00465 current_header = NULL;
00466
00467 return ERR_OK;
00468 }
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495 err_t
00496 ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
00497 u8_t ttl, u8_t tos,
00498 u8_t proto, struct netif *netif)
00499 {
00500 #if IP_OPTIONS_SEND
00501 return ip_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0);
00502 }
00503
00504
00505
00506
00507
00508
00509
00510 err_t ip_output_if_opt(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
00511 u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,
00512 u16_t optlen)
00513 {
00514 #endif
00515 struct ip_hdr *iphdr;
00516 static u16_t ip_id = 0;
00517
00518 snmp_inc_ipoutrequests();
00519
00520
00521 if (dest != IP_HDRINCL) {
00522 u16_t ip_hlen = IP_HLEN;
00523 #if IP_OPTIONS_SEND
00524 u16_t optlen_aligned = 0;
00525 if (optlen != 0) {
00526
00527 optlen_aligned = ((optlen + 3) & ~3);
00528 ip_hlen += optlen_aligned;
00529
00530 if (pbuf_header(p, optlen_aligned)) {
00531 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output_if_opt: not enough room for IP options in pbuf\n"));
00532 IP_STATS_INC(ip.err);
00533 snmp_inc_ipoutdiscards();
00534 return ERR_BUF;
00535 }
00536 MEMCPY(p->payload, ip_options, optlen);
00537 if (optlen < optlen_aligned) {
00538
00539 memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen);
00540 }
00541 }
00542 #endif
00543
00544 if (pbuf_header(p, IP_HLEN)) {
00545 LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output: not enough room for IP header in pbuf\n"));
00546
00547 IP_STATS_INC(ip.err);
00548 snmp_inc_ipoutdiscards();
00549 return ERR_BUF;
00550 }
00551
00552 iphdr = p->payload;
00553 LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
00554 (p->len >= sizeof(struct ip_hdr)));
00555
00556 IPH_TTL_SET(iphdr, ttl);
00557 IPH_PROTO_SET(iphdr, proto);
00558
00559 ip_addr_set(&(iphdr->dest), dest);
00560
00561 IPH_VHLTOS_SET(iphdr, 4, ip_hlen / 4, tos);
00562 IPH_LEN_SET(iphdr, htons(p->tot_len));
00563 IPH_OFFSET_SET(iphdr, 0);
00564 IPH_ID_SET(iphdr, htons(ip_id));
00565 ++ip_id;
00566
00567 if (ip_addr_isany(src)) {
00568 ip_addr_set(&(iphdr->src), &(netif->ip_addr));
00569 } else {
00570 ip_addr_set(&(iphdr->src), src);
00571 }
00572
00573 IPH_CHKSUM_SET(iphdr, 0);
00574 #if CHECKSUM_GEN_IP
00575 IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, ip_hlen));
00576 #endif
00577 } else {
00578
00579 iphdr = p->payload;
00580 dest = &(iphdr->dest);
00581 }
00582
00583 IP_STATS_INC(ip.xmit);
00584
00585 LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num));
00586 ip_debug_print(p);
00587
00588 #if ENABLE_LOOPBACK
00589 if (ip_addr_cmp(dest, &netif->ip_addr)) {
00590
00591 LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()"));
00592 return netif_loop_output(netif, p, dest);
00593 }
00594 #endif
00595 #if IP_FRAG
00596
00597 if (netif->mtu && (p->tot_len > netif->mtu)) {
00598 return ip_frag(p,netif,dest);
00599 }
00600 #endif
00601
00602 LWIP_DEBUGF(IP_DEBUG, ("netif->output()"));
00603 return netif->output(netif, p, dest);
00604 }
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623 err_t
00624 ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
00625 u8_t ttl, u8_t tos, u8_t proto)
00626 {
00627 struct netif *netif;
00628
00629 if ((netif = ip_route(dest)) == NULL) {
00630 LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr));
00631 IP_STATS_INC(ip.rterr);
00632 return ERR_RTE;
00633 }
00634
00635 return ip_output_if(p, src, dest, ttl, tos, proto, netif);
00636 }
00637
00638 #if LWIP_NETIF_HWADDRHINT
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657 err_t
00658 ip_output_hinted(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
00659 u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint)
00660 {
00661 struct netif *netif;
00662 err_t err;
00663
00664 if ((netif = ip_route(dest)) == NULL) {
00665 LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr));
00666 IP_STATS_INC(ip.rterr);
00667 return ERR_RTE;
00668 }
00669
00670 netif->addr_hint = addr_hint;
00671 err = ip_output_if(p, src, dest, ttl, tos, proto, netif);
00672 netif->addr_hint = NULL;
00673
00674 return err;
00675 }
00676 #endif
00677
00678 #if IP_DEBUG
00679
00680
00681
00682 void
00683 ip_debug_print(struct pbuf *p)
00684 {
00685 struct ip_hdr *iphdr = p->payload;
00686 u8_t *payload;
00687
00688 payload = (u8_t *)iphdr + IP_HLEN;
00689
00690 LWIP_DEBUGF(IP_DEBUG, ("IP header:\n"));
00691 LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
00692 LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" |%2"S16_F" | 0x%02"X16_F" | %5"U16_F" | (v, hl, tos, len)\n",
00693 IPH_V(iphdr),
00694 IPH_HL(iphdr),
00695 IPH_TOS(iphdr),
00696 ntohs(IPH_LEN(iphdr))));
00697 LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
00698 LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" |%"U16_F"%"U16_F"%"U16_F"| %4"U16_F" | (id, flags, offset)\n",
00699 ntohs(IPH_ID(iphdr)),
00700 ntohs(IPH_OFFSET(iphdr)) >> 15 & 1,
00701 ntohs(IPH_OFFSET(iphdr)) >> 14 & 1,
00702 ntohs(IPH_OFFSET(iphdr)) >> 13 & 1,
00703 ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK));
00704 LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
00705 LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | 0x%04"X16_F" | (ttl, proto, chksum)\n",
00706 IPH_TTL(iphdr),
00707 IPH_PROTO(iphdr),
00708 ntohs(IPH_CHKSUM(iphdr))));
00709 LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
00710 LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (src)\n",
00711 ip4_addr1(&iphdr->src),
00712 ip4_addr2(&iphdr->src),
00713 ip4_addr3(&iphdr->src),
00714 ip4_addr4(&iphdr->src)));
00715 LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
00716 LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (dest)\n",
00717 ip4_addr1(&iphdr->dest),
00718 ip4_addr2(&iphdr->dest),
00719 ip4_addr3(&iphdr->dest),
00720 ip4_addr4(&iphdr->dest)));
00721 LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
00722 }
00723 #endif