#include "lwip/opt.h"
#include "lwip/def.h"
#include "lwip/mem.h"
#include "lwip/ip.h"
#include "lwip/inet.h"
#include "lwip/netif.h"
#include "lwip/icmp.h"
#include "lwip/udp.h"
#include "lwip/tcp.h"
#include "lwip/stats.h"
#include "arch/perf.h"
Include dependency graph for ip6.c:
Go to the source code of this file.
Functions | |
void | ip_init (void) |
netif * | ip_route (struct ip_addr *dest) |
void | ip_forward (struct pbuf *p, struct ip_hdr *iphdr) |
void | ip_input (struct pbuf *p, struct netif *inp) |
err_t | ip_output_if (struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t proto, struct netif *netif) |
err_t | ip_output (struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t proto) |
|
Definition at line 96 of file ip6.c. References DEBUGF, ip_hdr::dest, ip_hdr::hoplim, ICMP_TE_TTL, icmp_time_exceeded(), ip_addr_debug_print, IP_DEBUG, IP_PROTO_ICMP, ip_route(), ip_hdr::nexthdr, NULL, and pbuf_free(). Referenced by ip_input().
00097 { 00098 struct netif *netif; 00099 00100 PERF_START; 00101 00102 if((netif = ip_route((struct ip_addr *)&(iphdr->dest))) == NULL) { 00103 00104 DEBUGF(IP_DEBUG, ("ip_input: no forwarding route found for ")); 00105 #if IP_DEBUG 00106 ip_addr_debug_print(&(iphdr->dest)); 00107 #endif /* IP_DEBUG */ 00108 DEBUGF(IP_DEBUG, ("\n")); 00109 pbuf_free(p); 00110 return; 00111 } 00112 /* Decrement TTL and send ICMP if ttl == 0. */ 00113 if(--iphdr->hoplim == 0) { 00114 /* Don't send ICMP messages in response to ICMP messages */ 00115 if(iphdr->nexthdr != IP_PROTO_ICMP) { 00116 icmp_time_exceeded(p, ICMP_TE_TTL); 00117 } 00118 pbuf_free(p); 00119 return; 00120 } 00121 00122 /* Incremental update of the IP checksum. */ 00123 /* if (iphdr->chksum >= htons(0xffff - 0x100)) { 00124 iphdr->chksum += htons(0x100) + 1; 00125 } else { 00126 iphdr->chksum += htons(0x100); 00127 }*/ 00128 00129 00130 DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to ")); 00131 #if IP_DEBUG 00132 ip_addr_debug_print(&(iphdr->dest)); 00133 #endif /* IP_DEBUG */ 00134 DEBUGF(IP_DEBUG, ("\n")); 00135 00136 #ifdef IP_STATS 00137 ++lwip_stats.ip.fw; 00138 ++lwip_stats.ip.xmit; 00139 #endif /* IP_STATS */ 00140 00141 PERF_STOP("ip_forward"); 00142 00143 netif->output(netif, p, (struct ip_addr *)&(iphdr->dest)); 00144 } |
Here is the call graph for this function:
|
Definition at line 63 of file ip6.c.
00064 { 00065 } |
|
Definition at line 157 of file ip6.c. References ip_addr::addr, DBG_TRACE, DEBUGF, ip_hdr::dest, DHCP_CLIENT_PORT, ERR_OK, htons, icmp_dest_unreach(), ICMP_DUR_PROTO, icmp_input(), inet_chksum(), IP_ADDR_BROADCAST, ip_addr_cmp, ip_addr_debug_print, ip_addr_isany, ip_addr_isbroadcast, ip_addr_ismulticast, ip_addr_maskcmp, IP_DEBUG, ip_forward(), IP_HLEN, IP_MF, IP_OFFMASK, IP_PROTO_ICMP, IP_PROTO_TCP, IP_PROTO_UDP, ip_reass(), IPH_HL, IPH_ID, IPH_LEN, IPH_OFFSET, IPH_PROTO, IPH_V, pbuf::len, netif_list, netif::netmask, ntohs, NULL, pbuf::payload, pbuf_free(), pbuf_header(), pbuf_realloc(), snmp_inc_ipindelivers, snmp_inc_ipindiscards, snmp_inc_ipinreceives, snmp_inc_ipunknownprotos, tcp_input(), pbuf::tot_len, u16_t, u8_t, and udp_input(). Referenced by tcpip_thread().
00157 { 00158 struct ip_hdr *iphdr; 00159 struct netif *netif; 00160 00161 00162 PERF_START; 00163 00164 #if IP_DEBUG 00165 ip_debug_print(p); 00166 #endif /* IP_DEBUG */ 00167 00168 00169 #ifdef IP_STATS 00170 ++lwip_stats.ip.recv; 00171 #endif /* IP_STATS */ 00172 00173 /* identify the IP header */ 00174 iphdr = p->payload; 00175 00176 00177 if(iphdr->v != 6) { 00178 DEBUGF(IP_DEBUG, ("IP packet dropped due to bad version number\n")); 00179 #if IP_DEBUG 00180 ip_debug_print(p); 00181 #endif /* IP_DEBUG */ 00182 pbuf_free(p); 00183 #ifdef IP_STATS 00184 ++lwip_stats.ip.err; 00185 ++lwip_stats.ip.drop; 00186 #endif /* IP_STATS */ 00187 return; 00188 } 00189 00190 /* is this packet for us? */ 00191 for(netif = netif_list; netif != NULL; netif = netif->next) { 00192 #if IP_DEBUG 00193 DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest ")); 00194 ip_addr_debug_print(&(iphdr->dest)); 00195 DEBUGF(IP_DEBUG, ("netif->ip_addr ")); 00196 ip_addr_debug_print(&(netif->ip_addr)); 00197 DEBUGF(IP_DEBUG, ("\n")); 00198 #endif /* IP_DEBUG */ 00199 if(ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr))) { 00200 break; 00201 } 00202 } 00203 00204 00205 if(netif == NULL) { 00206 /* packet not for us, route or discard */ 00207 #ifdef IP_FORWARD 00208 ip_forward(p, iphdr); 00209 #endif 00210 pbuf_free(p); 00211 return; 00212 } 00213 00214 pbuf_realloc(p, IP_HLEN + ntohs(iphdr->len)); 00215 00216 /* send to upper layers */ 00217 #if IP_DEBUG 00218 /* DEBUGF("ip_input: \n"); 00219 ip_debug_print(p); 00220 DEBUGF("ip_input: p->len %u p->tot_len %u\n", p->len, p->tot_len);*/ 00221 #endif /* IP_DEBUG */ 00222 00223 00224 pbuf_header(p, -IP_HLEN); 00225 00226 switch(iphdr->nexthdr) { 00227 case IP_PROTO_UDP: 00228 udp_input(p); 00229 break; 00230 case IP_PROTO_TCP: 00231 tcp_input(p); 00232 break; 00233 case IP_PROTO_ICMP: 00234 icmp_input(p, inp); 00235 break; 00236 default: 00237 /* send ICMP destination protocol unreachable */ 00238 icmp_dest_unreach(p, ICMP_DUR_PROTO); 00239 pbuf_free(p); 00240 DEBUGF(IP_DEBUG, ("Unsupported transportation protocol %u\n", 00241 iphdr->nexthdr)); 00242 00243 #ifdef IP_STATS 00244 ++lwip_stats.ip.proterr; 00245 ++lwip_stats.ip.drop; 00246 #endif /* IP_STATS */ 00247 00248 } 00249 PERF_STOP("ip_input"); 00250 } |
Here is the call graph for this function:
|
Definition at line 322 of file ip6.c. References ip_addr::addr, DEBUGF, ERR_RTE, IP_DEBUG, ip_output_if(), ip_route(), NULL, and u8_t.
00324 { 00325 struct netif *netif; 00326 if((netif = ip_route(dest)) == NULL) { 00327 DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%lx\n", dest->addr)); 00328 #ifdef IP_STATS 00329 ++lwip_stats.ip.rterr; 00330 #endif /* IP_STATS */ 00331 return ERR_RTE; 00332 } 00333 00334 return ip_output_if(p, src, dest, ttl, proto, netif); 00335 } |
Here is the call graph for this function:
|
Definition at line 261 of file ip6.c. References DEBUGF, ERR_BUF, htons, netif::ip_addr, ip_addr_isany, ip_addr_set, IP_DEBUG, IP_HDRINCL, IP_HLEN, pbuf::len, netif::name, netif::output, pbuf::payload, pbuf_header(), pbuf::tot_len, and u8_t.
00264 { 00265 struct ip_hdr *iphdr; 00266 00267 PERF_START; 00268 00269 printf("len %u tot_len %u\n", p->len, p->tot_len); 00270 if(pbuf_header(p, IP_HLEN)) { 00271 DEBUGF(IP_DEBUG, ("ip_output: not enough room for IP header in pbuf\n")); 00272 #ifdef IP_STATS 00273 ++lwip_stats.ip.err; 00274 #endif /* IP_STATS */ 00275 00276 return ERR_BUF; 00277 } 00278 printf("len %u tot_len %u\n", p->len, p->tot_len); 00279 00280 iphdr = p->payload; 00281 00282 00283 if(dest != IP_HDRINCL) { 00284 printf("!IP_HDRLINCL\n"); 00285 iphdr->hoplim = ttl; 00286 iphdr->nexthdr = proto; 00287 iphdr->len = htons(p->tot_len - IP_HLEN); 00288 ip_addr_set(&(iphdr->dest), dest); 00289 00290 iphdr->v = 6; 00291 00292 if(ip_addr_isany(src)) { 00293 ip_addr_set(&(iphdr->src), &(netif->ip_addr)); 00294 } else { 00295 ip_addr_set(&(iphdr->src), src); 00296 } 00297 00298 } else { 00299 dest = &(iphdr->dest); 00300 } 00301 00302 #ifdef IP_STATS 00303 ++lwip_stats.ip.xmit; 00304 #endif /* IP_STATS */ 00305 00306 DEBUGF(IP_DEBUG, ("ip_output_if: %c%c (len %u)\n", netif->name[0], netif->name[1], p->tot_len)); 00307 #if IP_DEBUG 00308 ip_debug_print(p); 00309 #endif /* IP_DEBUG */ 00310 00311 PERF_STOP("ip_output_if"); 00312 return netif->output(netif, p, dest); 00313 } |
Here is the call graph for this function:
|
Definition at line 75 of file ip6.c. References ip_addr_maskcmp, netif_default, netif_list, and NULL. Referenced by ip_forward(), and ip_output().
00076 { 00077 struct netif *netif; 00078 00079 for(netif = netif_list; netif != NULL; netif = netif->next) { 00080 if(ip_addr_maskcmp(dest, &(netif->ip_addr), &(netif->netmask))) { 00081 return netif; 00082 } 00083 } 00084 00085 return netif_default; 00086 } |