58 #define UIP_IPH_LEN 40
59 #define UIP_FRAGH_LEN 8
61 #define UIP_IPH_LEN 20
64 #define UIP_UDPH_LEN 8
65 #define UIP_TCPH_LEN 20
66 #define UIP_ICMPH_LEN 4
68 #define UIP_IPUDPH_LEN (UIP_UDPH_LEN + UIP_IPH_LEN)
71 #define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN)
74 #define UIP_TCPIP_HLEN UIP_IPTCPH_LEN
75 #define UIP_IPICMPH_LEN (UIP_IPH_LEN + UIP_ICMPH_LEN)
77 #define UIP_LLIPH_LEN (UIP_LLH_LEN + UIP_IPH_LEN)
86 #define uip_l2_l3_hdr_len (UIP_LLH_LEN + UIP_IPH_LEN + uip_ext_len)
87 #define uip_l2_l3_icmp_hdr_len (UIP_LLH_LEN + UIP_IPH_LEN + uip_ext_len + UIP_ICMPH_LEN)
88 #define uip_l3_hdr_len (UIP_IPH_LEN + uip_ext_len)
89 #define uip_l3_icmp_hdr_len (UIP_IPH_LEN + uip_ext_len + UIP_ICMPH_LEN)
104 typedef union uip_ip6addr_t {
110 typedef uip_ip6addr_t uip_ipaddr_t;
138 #if UIP_CONF_LL_802154
141 #define UIP_802154_SHORTADDR_LEN 2
142 #define UIP_802154_LONGADDR_LEN 8
143 #define UIP_LLADDR_LEN UIP_802154_LONGADDR_LEN
145 #if UIP_CONF_LL_80211
148 #define UIP_LLADDR_LEN 6
152 #define UIP_LLADDR_LEN 6
193 #define uip_sethostaddr(addr) uip_ipaddr_copy(&uip_hostaddr, (addr))
213 #define uip_gethostaddr(addr) uip_ipaddr_copy((addr), &uip_hostaddr)
225 #define uip_setdraddr(addr) uip_ipaddr_copy(&uip_draddr, (addr))
237 #define uip_setnetmask(addr) uip_ipaddr_copy(&uip_netmask, (addr))
248 #define uip_getdraddr(addr) uip_ipaddr_copy((addr), &uip_draddr)
258 #define uip_getnetmask(addr) uip_ipaddr_copy((addr), &uip_netmask)
344 #define uip_input() uip_process(UIP_DATA)
390 #define uip_periodic(conn) do { uip_conn = &uip_conns[conn]; \
391 uip_process(UIP_TIMER); } while (0)
397 #define uip_conn_active(conn) (uip_conns[conn].tcpstateflags != UIP_CLOSED)
412 #define uip_periodic_conn(conn) do { uip_conn = conn; \
413 uip_process(UIP_TIMER); } while (0)
426 #define uip_poll_conn(conn) do { uip_conn = conn; \
427 uip_process(UIP_POLL_REQUEST); } while (0)
463 #define uip_udp_periodic(conn) do { uip_udp_conn = &uip_udp_conns[conn]; \
464 uip_process(UIP_UDP_TIMER); } while(0)
480 #define uip_udp_periodic_conn(conn) do { uip_udp_conn = conn; \
481 uip_process(UIP_UDP_TIMER); } while(0)
520 #define uip_buf (uip_aligned_buf.u8)
610 #define uip_outstanding(conn) ((conn)->len)
649 #define uip_datalen() uip_len
660 #define uip_urgdatalen() uip_urglen
669 #define uip_close() (uip_flags = UIP_CLOSE)
680 #define uip_abort() (uip_flags = UIP_ABORT)
690 #define uip_stop() (uip_conn->tcpstateflags |= UIP_STOPPED)
698 #define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED)
709 #define uip_restart() do { uip_flags |= UIP_NEWDATA; \
710 uip_conn->tcpstateflags &= ~UIP_STOPPED; \
725 #define uip_udpconnection() (uip_conn == NULL)
736 #define uip_newdata() (uip_flags & UIP_NEWDATA)
747 #define uip_acked() (uip_flags & UIP_ACKDATA)
759 #define uip_connected() (uip_flags & UIP_CONNECTED)
769 #define uip_closed() (uip_flags & UIP_CLOSE)
779 #define uip_aborted() (uip_flags & UIP_ABORT)
789 #define uip_timedout() (uip_flags & UIP_TIMEDOUT)
801 #define uip_rexmit() (uip_flags & UIP_REXMIT)
815 #define uip_poll() (uip_flags & UIP_POLL)
823 #define uip_initialmss() (uip_conn->initialmss)
836 #define uip_mss() (uip_conn->mss)
874 #define uip_udp_remove(conn) (conn)->lport = 0
886 #define uip_udp_bind(conn, port) (conn)->lport = port
899 #define uip_udp_send(len) uip_send((char *)uip_appdata, len)
925 #define uip_ipaddr_to_quad(a) (a)->u8[0],(a)->u8[1],(a)->u8[2],(a)->u8[3]
953 #define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \
954 (addr)->u8[0] = addr0; \
955 (addr)->u8[1] = addr1; \
956 (addr)->u8[2] = addr2; \
957 (addr)->u8[3] = addr3; \
967 #define uip_ip6addr(addr, addr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7) do { \
968 (addr)->u16[0] = UIP_HTONS(addr0); \
969 (addr)->u16[1] = UIP_HTONS(addr1); \
970 (addr)->u16[2] = UIP_HTONS(addr2); \
971 (addr)->u16[3] = UIP_HTONS(addr3); \
972 (addr)->u16[4] = UIP_HTONS(addr4); \
973 (addr)->u16[5] = UIP_HTONS(addr5); \
974 (addr)->u16[6] = UIP_HTONS(addr6); \
975 (addr)->u16[7] = UIP_HTONS(addr7); \
985 #define uip_ip6addr_u8(addr, addr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7,addr8,addr9,addr10,addr11,addr12,addr13,addr14,addr15) do { \
986 (addr)->u8[0] = addr0; \
987 (addr)->u8[1] = addr1; \
988 (addr)->u8[2] = addr2; \
989 (addr)->u8[3] = addr3; \
990 (addr)->u8[4] = addr4; \
991 (addr)->u8[5] = addr5; \
992 (addr)->u8[6] = addr6; \
993 (addr)->u8[7] = addr7; \
994 (addr)->u8[8] = addr8; \
995 (addr)->u8[9] = addr9; \
996 (addr)->u8[10] = addr10; \
997 (addr)->u8[11] = addr11; \
998 (addr)->u8[12] = addr12; \
999 (addr)->u8[13] = addr13; \
1000 (addr)->u8[14] = addr14; \
1001 (addr)->u8[15] = addr15; \
1023 #ifndef uip_ipaddr_copy
1024 #define uip_ipaddr_copy(dest, src) (*(dest) = *(src))
1026 #ifndef uip_ip4addr_copy
1027 #define uip_ip4addr_copy(dest, src) (*(dest) = *(src))
1029 #ifndef uip_ip6addr_copy
1030 #define uip_ip6addr_copy(dest, src) (*(dest) = *(src))
1053 #define uip_ip4addr_cmp(addr1, addr2) ((addr1)->u16[0] == (addr2)->u16[0] && \
1054 (addr1)->u16[1] == (addr2)->u16[1])
1055 #define uip_ip6addr_cmp(addr1, addr2) (memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0)
1058 #define uip_ipaddr_cmp(addr1, addr2) uip_ip6addr_cmp(addr1, addr2)
1060 #define uip_ipaddr_cmp(addr1, addr2) uip_ip4addr_cmp(addr1, addr2)
1088 #define uip_ipaddr_maskcmp(addr1, addr2, mask) \
1089 (((((uint16_t *)addr1)[0] & ((uint16_t *)mask)[0]) == \
1090 (((uint16_t *)addr2)[0] & ((uint16_t *)mask)[0])) && \
1091 ((((uint16_t *)addr1)[1] & ((uint16_t *)mask)[1]) == \
1092 (((uint16_t *)addr2)[1] & ((uint16_t *)mask)[1])))
1094 #define uip_ipaddr_prefixcmp(addr1, addr2, length) (memcmp(addr1, addr2, length>>3) == 0)
1140 #define uip_ipaddr_mask(dest, src, mask) do { \
1141 ((uint16_t *)dest)[0] = ((uint16_t *)src)[0] & ((uint16_t *)mask)[0]; \
1142 ((uint16_t *)dest)[1] = ((uint16_t *)src)[1] & ((uint16_t *)mask)[1]; \
1163 #define uip_ipaddr1(addr) ((addr)->u8[0])
1183 #define uip_ipaddr2(addr) ((addr)->u8[1])
1203 #define uip_ipaddr3(addr) ((addr)->u8[2])
1223 #define uip_ipaddr4(addr) ((addr)->u8[3])
1235 # if UIP_BYTE_ORDER == UIP_BIG_ENDIAN
1236 # define UIP_HTONS(n) (n)
1237 # define UIP_HTONL(n) (n)
1239 # define UIP_HTONS(n) (uint16_t)((((uint16_t) (n)) << 8) | (((uint16_t) (n)) >> 8))
1240 # define UIP_HTONL(n) (((uint32_t)UIP_HTONS(n) << 16) | UIP_HTONS((uint32_t)(n) >> 16))
1243 #error "UIP_HTONS already defined!"
1257 #define uip_ntohs uip_htons
1261 CCIF uint32_t uip_htonl(uint32_t val);
1264 #define uip_ntohl uip_htonl
1284 extern void *uip_urgdata;
1320 extern uint16_t uip_urglen, uip_surglen;
1408 struct uip_fallback_interface {
1410 void (*output)(void);
1414 struct uip_icmp6_conn {
1415 uip_icmp6_appstate_t appstate;
1417 extern struct uip_icmp6_conn uip_icmp6_conns;
1425 #if UIP_STATISTICS == 1
1427 #define UIP_STAT(s) s
1480 uip_stats_t syndrop;
1519 CCIF extern uint8_t uip_flags;
1528 #define UIP_ACKDATA 1
1532 #define UIP_NEWDATA 2
1534 #define UIP_REXMIT 4
1539 #define UIP_CLOSE 16
1544 #define UIP_ABORT 32
1549 #define UIP_CONNECTED 64
1554 #define UIP_TIMEDOUT 128
1586 #define UIP_POLL_REQUEST 3
1588 #define UIP_UDP_SEND_CONN 4
1592 #define UIP_UDP_TIMER 5
1596 #define UIP_CLOSED 0
1597 #define UIP_SYN_RCVD 1
1598 #define UIP_SYN_SENT 2
1599 #define UIP_ESTABLISHED 3
1600 #define UIP_FIN_WAIT_1 4
1601 #define UIP_FIN_WAIT_2 5
1602 #define UIP_CLOSING 6
1603 #define UIP_TIME_WAIT 7
1604 #define UIP_LAST_ACK 8
1605 #define UIP_TS_MASK 15
1607 #define UIP_STOPPED 16
1610 struct uip_tcpip_hdr {
1618 uip_ip6addr_t srcipaddr, destipaddr;
1629 uip_ipaddr_t srcipaddr, destipaddr;
1646 struct uip_icmpip_hdr {
1654 uip_ip6addr_t srcipaddr, destipaddr;
1665 uip_ipaddr_t srcipaddr, destipaddr;
1669 uint8_t type, icode;
1670 uint16_t icmpchksum;
1679 struct uip_udpip_hdr {
1687 uip_ip6addr_t srcipaddr, destipaddr;
1698 uip_ipaddr_t srcipaddr, destipaddr;
1722 uip_ip6addr_t srcipaddr, destipaddr;
1733 uip_ipaddr_t srcipaddr, destipaddr;
1759 typedef struct uip_ext_hdr {
1765 typedef struct uip_hbho_hdr {
1771 typedef struct uip_desto_hdr {
1786 typedef struct uip_routing_hdr {
1789 uint8_t routing_type;
1794 typedef struct uip_frag_hdr {
1797 uint16_t offsetresmore;
1805 typedef struct uip_ext_hdr_opt {
1811 typedef struct uip_ext_hdr_opt_padn {
1814 } uip_ext_hdr_opt_padn;
1817 typedef struct uip_ext_hdr_opt_rpl {
1822 uint16_t senderrank;
1823 } uip_ext_hdr_opt_rpl;
1826 struct uip_tcp_hdr {
1840 struct uip_icmp_hdr {
1841 uint8_t type, icode;
1842 uint16_t icmpchksum;
1850 struct uip_udp_hdr {
1872 #define UIP_APPDATA_SIZE (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)
1873 #define UIP_APPDATA_PTR (void *)&uip_buf[UIP_LLH_LEN + UIP_TCPIP_HLEN]
1875 #define UIP_PROTO_ICMP 1
1876 #define UIP_PROTO_TCP 6
1877 #define UIP_PROTO_UDP 17
1878 #define UIP_PROTO_ICMP6 58
1884 #define UIP_PROTO_HBHO 0
1885 #define UIP_PROTO_DESTO 60
1886 #define UIP_PROTO_ROUTING 43
1887 #define UIP_PROTO_FRAG 44
1888 #define UIP_PROTO_NONE 59
1893 #define UIP_EXT_HDR_OPT_PAD1 0
1894 #define UIP_EXT_HDR_OPT_PADN 1
1895 #define UIP_EXT_HDR_OPT_RPL 0x63
1908 #define UIP_EXT_HDR_BITMAP_HBHO 0x01
1909 #define UIP_EXT_HDR_BITMAP_DESTO1 0x02
1910 #define UIP_EXT_HDR_BITMAP_ROUTING 0x04
1911 #define UIP_EXT_HDR_BITMAP_FRAG 0x08
1912 #define UIP_EXT_HDR_BITMAP_AH 0x10
1913 #define UIP_EXT_HDR_BITMAP_ESP 0x20
1914 #define UIP_EXT_HDR_BITMAP_DESTO2 0x40
1922 CCIF extern const uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr;
1924 CCIF extern uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr;
1926 CCIF extern const uip_ipaddr_t uip_broadcast_addr;
1927 CCIF extern const uip_ipaddr_t uip_all_zeroes_addr;
1929 #if UIP_FIXEDETHADDR
1940 #define UIP_LLPREF_LEN 10
1946 #define uip_is_addr_loopback(a) \
1947 ((((a)->u16[0]) == 0) && \
1948 (((a)->u16[1]) == 0) && \
1949 (((a)->u16[2]) == 0) && \
1950 (((a)->u16[3]) == 0) && \
1951 (((a)->u16[4]) == 0) && \
1952 (((a)->u16[5]) == 0) && \
1953 (((a)->u16[6]) == 0) && \
1954 (((a)->u8[14]) == 0) && \
1955 (((a)->u8[15]) == 0x01))
1960 #define uip_is_addr_unspecified(a) \
1961 ((((a)->u16[0]) == 0) && \
1962 (((a)->u16[1]) == 0) && \
1963 (((a)->u16[2]) == 0) && \
1964 (((a)->u16[3]) == 0) && \
1965 (((a)->u16[4]) == 0) && \
1966 (((a)->u16[5]) == 0) && \
1967 (((a)->u16[6]) == 0) && \
1968 (((a)->u16[7]) == 0))
1971 #define uip_is_addr_linklocal_allnodes_mcast(a) \
1972 ((((a)->u8[0]) == 0xff) && \
1973 (((a)->u8[1]) == 0x02) && \
1974 (((a)->u16[1]) == 0) && \
1975 (((a)->u16[2]) == 0) && \
1976 (((a)->u16[3]) == 0) && \
1977 (((a)->u16[4]) == 0) && \
1978 (((a)->u16[5]) == 0) && \
1979 (((a)->u16[6]) == 0) && \
1980 (((a)->u8[14]) == 0) && \
1981 (((a)->u8[15]) == 0x01))
1984 #define uip_is_addr_linklocal_allrouters_mcast(a) \
1985 ((((a)->u8[0]) == 0xff) && \
1986 (((a)->u8[1]) == 0x02) && \
1987 (((a)->u16[1]) == 0) && \
1988 (((a)->u16[2]) == 0) && \
1989 (((a)->u16[3]) == 0) && \
1990 (((a)->u16[4]) == 0) && \
1991 (((a)->u16[5]) == 0) && \
1992 (((a)->u16[6]) == 0) && \
1993 (((a)->u8[14]) == 0) && \
1994 (((a)->u8[15]) == 0x02))
2000 #define uip_is_addr_linklocal(a) \
2001 ((a)->u8[0] == 0xfe && \
2005 #define uip_create_unspecified(a) uip_ip6addr(a, 0, 0, 0, 0, 0, 0, 0, 0)
2008 #define uip_create_linklocal_allnodes_mcast(a) uip_ip6addr(a, 0xff02, 0, 0, 0, 0, 0, 0, 0x0001)
2011 #define uip_create_linklocal_allrouters_mcast(a) uip_ip6addr(a, 0xff02, 0, 0, 0, 0, 0, 0, 0x0002)
2012 #define uip_create_linklocal_prefix(addr) do { \
2013 (addr)->u16[0] = UIP_HTONS(0xfe80); \
2014 (addr)->u16[1] = 0; \
2015 (addr)->u16[2] = 0; \
2016 (addr)->u16[3] = 0; \
2023 #define uip_is_addr_solicited_node(a) \
2024 ((((a)->u8[0]) == 0xFF) && \
2025 (((a)->u8[1]) == 0x02) && \
2026 (((a)->u16[1]) == 0x00) && \
2027 (((a)->u16[2]) == 0x00) && \
2028 (((a)->u16[3]) == 0x00) && \
2029 (((a)->u16[4]) == 0x00) && \
2030 (((a)->u8[10]) == 0x00) && \
2031 (((a)->u8[11]) == 0x01) && \
2032 (((a)->u8[12]) == 0xFF))
2038 #define uip_create_solicited_node(a, b) \
2039 (((b)->u8[0]) = 0xFF); \
2040 (((b)->u8[1]) = 0x02); \
2041 (((b)->u16[1]) = 0); \
2042 (((b)->u16[2]) = 0); \
2043 (((b)->u16[3]) = 0); \
2044 (((b)->u16[4]) = 0); \
2045 (((b)->u8[10]) = 0); \
2046 (((b)->u8[11]) = 0x01); \
2047 (((b)->u8[12]) = 0xFF); \
2048 (((b)->u8[13]) = ((a)->u8[13])); \
2049 (((b)->u16[7]) = ((a)->u16[7]))
2056 #define uip_is_addr_link_local(a) \
2057 ((((a)->u8[0]) == 0xFE) && \
2058 (((a)->u8[1]) == 0x80))
2065 #if UIP_CONF_LL_802154
2066 #define uip_is_addr_mac_addr_based(a, m) \
2067 ((((a)->u8[8]) == (((m)->addr[0]) ^ 0x02)) && \
2068 (((a)->u8[9]) == (m)->addr[1]) && \
2069 (((a)->u8[10]) == (m)->addr[2]) && \
2070 (((a)->u8[11]) == (m)->addr[3]) && \
2071 (((a)->u8[12]) == (m)->addr[4]) && \
2072 (((a)->u8[13]) == (m)->addr[5]) && \
2073 (((a)->u8[14]) == (m)->addr[6]) && \
2074 (((a)->u8[15]) == (m)->addr[7]))
2077 #define uip_is_addr_mac_addr_based(a, m) \
2078 ((((a)->u8[8]) == (((m)->addr[0]) | 0x02)) && \
2079 (((a)->u8[9]) == (m)->addr[1]) && \
2080 (((a)->u8[10]) == (m)->addr[2]) && \
2081 (((a)->u8[11]) == 0xff) && \
2082 (((a)->u8[12]) == 0xfe) && \
2083 (((a)->u8[13]) == (m)->addr[3]) && \
2084 (((a)->u8[14]) == (m)->addr[4]) && \
2085 (((a)->u8[15]) == (m)->addr[5]))
2093 #define uip_is_addr_mcast(a) \
2094 (((a)->u8[0]) == 0xFF)
2100 #define uip_is_addr_mcast_global(a) \
2101 ((((a)->u8[0]) == 0xFF) && \
2102 (((a)->u8[1] & 0x0F) == 0x0E))
2110 #define uip_is_addr_mcast_non_routable(a) \
2111 ((((a)->u8[0]) == 0xFF) && \
2112 (((a)->u8[1] & 0x0F) <= 0x02))
2121 #define uip_is_addr_mcast_routable(a) \
2122 ((((a)->u8[0]) == 0xFF) && \
2123 (((a)->u8[1] & 0x0F) > 0x02))
2129 #define uip_is_mcast_group_id_all_nodes(a) \
2130 ((((a)->u16[1]) == 0) && \
2131 (((a)->u16[2]) == 0) && \
2132 (((a)->u16[3]) == 0) && \
2133 (((a)->u16[4]) == 0) && \
2134 (((a)->u16[5]) == 0) && \
2135 (((a)->u16[6]) == 0) && \
2136 (((a)->u8[14]) == 0) && \
2137 (((a)->u8[15]) == 1))
2143 #define uip_is_mcast_group_id_all_routers(a) \
2144 ((((a)->u16[1]) == 0) && \
2145 (((a)->u16[2]) == 0) && \
2146 (((a)->u16[3]) == 0) && \
2147 (((a)->u16[4]) == 0) && \
2148 (((a)->u16[5]) == 0) && \
2149 (((a)->u16[6]) == 0) && \
2150 (((a)->u8[14]) == 0) && \
2151 (((a)->u8[15]) == 2))
2158 #define uip_are_solicited_bytes_equal(a, b) \
2159 ((((a)->u8[13]) == ((b)->u8[13])) && \
2160 (((a)->u8[14]) == ((b)->u8[14])) && \
2161 (((a)->u8[15]) == ((b)->u8[15])))
2181 uint16_t
uip_chksum(uint16_t *buf, uint16_t len);