57 #include "contiki-conf.h" 59 #include "lib/assert.h" 63 #ifdef AODV_COMPLIANCE 64 #include "net/uaodv-def.h" 129 #define BUF ((struct tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) 134 #define ICMPBUF ((struct icmpip_hdr *)&uip_buf[UIP_LLH_LEN]) 140 struct fwcache_entry {
153 #if UIP_REASSEMBLY > 0 154 uint16_t len, offset;
161 #ifdef UIP_CONF_FWCACHE_SIZE 162 #define FWCACHE_SIZE UIP_CONF_FWCACHE_SIZE 164 #define FWCACHE_SIZE 2 172 static struct fwcache_entry fwcache[FWCACHE_SIZE];
190 while(netifs != NULL) {
192 netifs = netifs->
next;
214 return (ipaddr->u16[0] & netmask->u16[0]) == (netipaddr->u16[0] & netmask->u16[0]) &&
215 (ipaddr->u16[1] & netmask->u16[1]) == (netipaddr->u16[1] & netmask->u16[1]);
231 if(ICMPBUF->proto == UIP_PROTO_ICMP &&
232 ICMPBUF->type != ICMP_ECHO) {
237 memcpy(&(ICMPBUF->payload[0]), ICMPBUF, UIP_IPH_LEN + 8);
240 ICMPBUF->type = ICMP_TE;
244 ICMPBUF->icmpchksum = 0;
245 ICMPBUF->icmpchksum = ~
uip_chksum((uint16_t *)&(ICMPBUF->type), 36);
258 ICMPBUF->len[1] = (uint8_t)
uip_len;
263 ICMPBUF->ipoffset[0] = ICMPBUF->ipoffset[1] = 0;
265 ICMPBUF->proto = UIP_PROTO_ICMP;
268 ICMPBUF->ipchksum = 0;
281 fwcache_register(
void)
283 struct fwcache_entry *fw;
290 for(i = 0; i < FWCACHE_SIZE; ++i) {
291 if(fwcache[i].
timer == 0) {
294 }
else if(fwcache[i].
timer <= oldest) {
296 oldest = fwcache[i].timer;
301 fw->ipid = BUF->ipid;
304 fw->proto = BUF->proto;
306 fw->payload[0] = BUF->srcport;
307 fw->payload[1] = BUF->destport;
309 #if UIP_REASSEMBLY > 0 311 fw->offset = BUF->ipoffset;
326 for(netif = netifs; netif != NULL; netif = netif->
next) {
327 if(ipaddr_maskcmp(destipaddr, &netif->
ipaddr,
349 assert(!uip_ipaddr_cmp(destipaddr, &uip_broadcast_addr));
352 netif = find_netif(destipaddr);
353 if(netif != NULL && netif->
quote != NULL)
354 quote = netif->
quote(netif);
380 const struct uip_udpip_hdr *udp = (
void *)BUF;
391 if(uip_ipaddr_cmp(&udp->destipaddr, &uip_broadcast_addr) ||
392 (udp->destipaddr.u8[3] >= 224 && udp->destipaddr.u8[3] <= 239)) {
393 if(defaultnetif != NULL) {
394 defaultnetif->
output(defaultnetif);
396 for(netif = netifs; netif != NULL; netif = netif->
next) {
397 if (netif != defaultnetif) {
405 netif = find_netif(&BUF->destipaddr);
415 return netif->
output(netif);
430 struct fwcache_entry *fw;
434 if(uip_ipaddr_cmp(&BUF->destipaddr, &uip_hostaddr)) {
438 #ifdef AODV_COMPLIANCE 439 #define udp ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN]) 440 if(udp->proto == UIP_PROTO_UDP && udp->destport ==
UIP_HTONS(UAODV_UDPPORT)) {
448 if(uip_ipaddr_cmp(&uip_hostaddr, &uip_all_zeroes_addr) &&
449 BUF->proto == UIP_PROTO_ICMP &&
450 ICMPBUF->type == ICMP_ECHO) {
458 for(fw = fwcache; fw < &fwcache[FWCACHE_SIZE]; ++fw) {
461 fw->len == BUF->len &&
462 fw->offset == BUF->ipoffset &&
464 fw->ipid == BUF->ipid &&
465 uip_ipaddr_cmp(&fw->srcipaddr, &BUF->srcipaddr) &&
466 uip_ipaddr_cmp(&fw->destipaddr, &BUF->destipaddr) &&
468 fw->payload[0] == BUF->srcport &&
469 fw->payload[1] == BUF->destport &&
471 fw->proto == BUF->proto) {
483 if(uip_ipaddr_cmp(&BUF->destipaddr, &uip_broadcast_addr)) {
490 BUF->ttl = BUF->ttl - 1;
493 if(BUF->ipchksum >=
UIP_HTONS(0xffff - 0x0100)) {
494 BUF->ipchksum = BUF->ipchksum +
UIP_HTONS(0x0100) + 1;
496 BUF->ipchksum = BUF->ipchksum +
UIP_HTONS(0x0100);
505 if(uip_ipaddr_cmp(&BUF->destipaddr, &uip_broadcast_addr)) {
525 netif->
next = netifs;
542 defaultnetif = netif;
552 struct fwcache_entry *fw;
553 for(fw = fwcache; fw < &fwcache[FWCACHE_SIZE]; ++fw) {
uint8_t uip_fw_forward(void)
void uip_fw_default(struct uip_fw_netif *netif)
void uip_fw_register(struct uip_fw_netif *netif)
bool uip_fw_quote(const uip_ipaddr_t *destipaddr)
uint16_t uip_chksum(uint16_t *data, uint16_t len)
bool(* quote)(struct uip_fw_netif *netif)
void uip_fw_periodic(void)
uint16_t uip_ipchksum(void)
uint8_t uip_fw_output(void)
#define uip_ipaddr_copy(dest, src)
uint8_t(* output)(struct uip_fw_netif *netif)
struct uip_fw_netif * next