/* Various stub functions and uIP variables other code might need to * compile. Allows you to save needing to compile all of uIP in just * to get a few things */ #include "net/uip.h" #include <string.h> #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) u8_t uip_buf[UIP_BUFSIZE + 2]; u16_t uip_len; struct uip_stats uip_stat; uip_lladdr_t uip_lladdr; u16_t htons(u16_t val) { return HTONS(val);} /********** UIP_NETIF.c **********/ void uip_netif_addr_autoconf_set(uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr) { /* We consider only links with IEEE EUI-64 identifier or IEEE 48-bit MAC addresses */ #if (UIP_LLADDR_LEN == 8) memcpy(ipaddr->u8 + 8, lladdr, UIP_LLADDR_LEN); ipaddr->u8[8] ^= 0x02; #elif (UIP_LLADDR_LEN == 6) memcpy(ipaddr->u8 + 8, lladdr, 3); ipaddr->u8[11] = 0xff; ipaddr->u8[12] = 0xfe; memcpy(ipaddr->u8 + 13, lladdr + 3, 3); ipaddr->u8[8] ^= 0x02; #else /* UIP_LOG("CAN NOT BUIL INTERFACE IDENTIFIER"); UIP_LOG("THE STACK IS GOING TO SHUT DOWN"); UIP_LOG("THE HOST WILL BE UNREACHABLE"); */ exit(-1); #endif } /********** UIP.c ****************/ static u16_t chksum(u16_t sum, const u8_t *data, u16_t len) { u16_t t; const u8_t *dataptr; const u8_t *last_byte; dataptr = data; last_byte = data + len - 1; while(dataptr < last_byte) { /* At least two more bytes */ t = (dataptr[0] << 8) + dataptr[1]; sum += t; if(sum < t) { sum++; /* carry */ } dataptr += 2; } if(dataptr == last_byte) { t = (dataptr[0] << 8) + 0; sum += t; if(sum < t) { sum++; /* carry */ } } /* Return sum in host byte order. */ return sum; } static u16_t upper_layer_chksum(u8_t proto) { u16_t upper_layer_len; u16_t sum; upper_layer_len = (((u16_t)(UIP_IP_BUF->len[0]) << 8) + UIP_IP_BUF->len[1]) ; /* First sum pseudoheader. */ /* IP protocol and length fields. This addition cannot carry. */ sum = upper_layer_len + proto; /* Sum IP source and destination addresses. */ sum = chksum(sum, (u8_t *)&UIP_IP_BUF->srcipaddr, 2 * sizeof(uip_ipaddr_t)); /* Sum TCP header and data. */ sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_len); return (sum == 0) ? 0xffff : htons(sum); } /*---------------------------------------------------------------------------*/ u16_t uip_icmp6chksum(void) { return upper_layer_chksum(UIP_PROTO_ICMP6); }