Contiki-Inga 3.x
|
The uIP IPv6 stack provides new Internet communication abilities to Contiki. More...
Modules | |
RPL implementation ContikiRPL (RFC 6550). | |
IPv6 Neighbor cache (link-layer/IPv6 address mapping) | |
Data structure and methods for IPv6 Neighbor Cache (RFC 4861, section 5.1) | |
Routing | |
Network interface and stateless autoconfiguration (RFC 4862) | |
Neighbor discovery (RFC 4861) | |
Files | |
file | rpl-ext-header.c |
Management of extension headers for ContikiRPL. | |
file | rpl-icmp6.c |
ICMP6 I/O for RPL control messages. | |
file | rpl-mrhof.c |
The Minimum Rank with Hysteresis Objective Function (MRHOF) | |
file | rpl-of0.c |
An implementation of RPL's objective function 0. | |
file | rpl-timers.c |
RPL timer management. | |
file | uip-ds6.c |
IPv6 data structures handling functions. | |
file | uip-icmp6.c |
ICMPv6 echo request and error messages (RFC 4443) | |
file | uip-icmp6.h |
ICMPv6 echo request and error messages (RFC 4443) | |
file | uip6.c |
The uIP TCP/IPv6 stack code. | |
Data Structures | |
struct | uip_icmp6_error |
ICMPv6 Error message constant part. More... | |
Macros | |
#define | UIP_ICMP6_ECHO_REQUEST_LEN 4 |
Echo Request constant part length. | |
#define | UIP_ICMP6_ERROR_LEN 4 |
ICMPv6 Error message constant part length. | |
#define | UIP_ND6_OPT_HDR_BUF ((uip_nd6_opt_hdr *)&uip_buf[uip_l2_l3_icmp_hdr_len + nd6_opt_offset]) |
Pointer to ND option. | |
Typedefs | |
typedef struct uip_icmp6_error | uip_icmp6_error |
ICMPv6 Error message constant part. | |
Functions | |
enum rpl_mode | rpl_get_mode (void) |
Get the RPL mode. More... | |
enum rpl_mode | rpl_set_mode (enum rpl_mode m) |
Set the RPL mode. More... | |
void | uip_ds6_neighbors_init (void) |
Initialize neighbor cache. More... | |
uip_ds6_nbr_t * | uip_ds6_nbr_add (const uip_ipaddr_t *ipaddr, const uip_lladdr_t *lladdr, uint8_t isrouter, uint8_t state) |
Adds a neighbor to the neighbor cache. More... | |
void | uip_ds6_nbr_rm (uip_ds6_nbr_t *nbr) |
Removes entry from neighbor cache. | |
const uip_ipaddr_t * | uip_ds6_nbr_get_ipaddr (const uip_ds6_nbr_t *nbr) |
Returns IP address of neighbor. | |
const uip_lladdr_t * | uip_ds6_nbr_get_ll (const uip_ds6_nbr_t *nbr) |
Returns link-local address of neighbor. | |
int | uip_ds6_nbr_num (void) |
? | |
uip_ds6_nbr_t * | uip_ds6_nbr_lookup (const uip_ipaddr_t *ipaddr) |
Lookup if a neighbor cache entry for given IP address exists. More... | |
uip_ds6_nbr_t * | uip_ds6_nbr_ll_lookup (const uip_lladdr_t *lladdr) |
Lookup if a neighbor cache entry for given link-layer address exists. More... | |
uip_ipaddr_t * | uip_ds6_nbr_ipaddr_from_lladdr (const uip_lladdr_t *lladdr) |
Returns IP address associated with link-local address, based on neighbor cache entry. More... | |
const uip_lladdr_t * | uip_ds6_nbr_lladdr_from_ipaddr (const uip_ipaddr_t *ipaddr) |
Returns link-layer address associated with IP address, based on neighbor cache entry. More... | |
void | uip_ds6_link_neighbor_callback (int status, int numtx) |
? | |
void | uip_ds6_neighbor_periodic (void) |
? | |
uip_ds6_nbr_t * | uip_ds6_get_least_lifetime_neighbor (void) |
This searches inside the neighbor table for the neighbor that is about to expire the next. More... | |
void | uip_ds6_init (void) |
Initialize data structures. | |
void | uip_ds6_periodic (void) |
Periodic processing of data structures. | |
uint8_t | uip_ds6_list_loop (uip_ds6_element_t *list, uint8_t size, uint16_t elementsize, uip_ipaddr_t *ipaddr, uint8_t ipaddrlen, uip_ds6_element_t **out_element) |
Generic loop routine on an abstract data structure, which generalizes all data structures used in DS6. | |
void | uip_ds6_select_src (uip_ipaddr_t *src, uip_ipaddr_t *dst) |
Source address selection, see RFC 3484. | |
void | uip_ds6_set_addr_iid (uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr) |
set the last 64 bits of an IP address based on the MAC address | |
uint8_t | get_match_length (uip_ipaddr_t *src, uip_ipaddr_t *dst) |
Get the number of matching bits of two addresses. | |
void | uip_ds6_send_rs (void) |
Send periodic RS to find router. | |
uint32_t | uip_ds6_compute_reachable_time (void) |
Compute the reachable time based on base reachable time, see RFC 4861. | |
uint16_t | uip_chksum (uint16_t *data, uint16_t len) |
Calculate the Internet checksum over a buffer. More... | |
uint16_t | uip_ipchksum (void) |
Calculate the IP header checksum of the packet header in uip_buf. More... | |
uint16_t | uip_icmp6chksum (void) |
Calculate the ICMP checksum of the packet in uip_buf. More... | |
void | uip_init (void) |
uIP initialization function. More... | |
void | uip_process (uint8_t flag) |
process the options within a hop by hop or destination option header More... | |
uint16_t | uip_htons (uint16_t val) |
Convert a 16-bit quantity from host byte order to network byte order. More... | |
void | uip_send (const void *data, int len) |
Send data on the current connection. More... | |
Variables | |
struct etimer | uip_ds6_timer_rs |
Timer for maintenance of data structures. | |
"DS6" Data structures | |
uip_ds6_netif_t | uip_ds6_if |
uip_ds6_prefix_t | uip_ds6_prefix_list [UIP_DS6_PREFIX_NB] |
The single interface. | |
uint8_t | uip_ds6_addr_size |
Prefix list. | |
uint8_t | uip_ds6_netif_addr_list_offset |
ICMPv6 message types | |
#define | ICMP6_DST_UNREACH 1 |
dest unreachable | |
#define | ICMP6_PACKET_TOO_BIG 2 |
packet too big | |
#define | ICMP6_TIME_EXCEEDED 3 |
time exceeded | |
#define | ICMP6_PARAM_PROB 4 |
ip6 header bad | |
#define | ICMP6_ECHO_REQUEST 128 |
Echo request. | |
#define | ICMP6_ECHO_REPLY 129 |
Echo reply. | |
#define | ICMP6_RS 133 |
Router Solicitation. | |
#define | ICMP6_RA 134 |
Router Advertisement. | |
#define | ICMP6_NS 135 |
Neighbor Solicitation. | |
#define | ICMP6_NA 136 |
Neighbor advertisement. | |
#define | ICMP6_REDIRECT 137 |
Redirect. | |
#define | ICMP6_RPL 155 |
RPL. | |
#define | ICMP6_PRIV_EXP_100 100 |
Private Experimentation. | |
#define | ICMP6_PRIV_EXP_101 101 |
Private Experimentation. | |
#define | ICMP6_PRIV_EXP_200 200 |
Private Experimentation. | |
#define | ICMP6_PRIV_EXP_201 201 |
Private Experimentation. | |
#define | ICMP6_ROLL_TM ICMP6_PRIV_EXP_200 |
ROLL Trickle Multicast. | |
ICMPv6 Destination Unreachable message codes | |
#define | ICMP6_DST_UNREACH_NOROUTE 0 |
no route to destination | |
#define | ICMP6_DST_UNREACH_ADMIN 1 |
administratively prohibited | |
#define | ICMP6_DST_UNREACH_NOTNEIGHBOR 2 |
not a neighbor(obsolete) | |
#define | ICMP6_DST_UNREACH_BEYONDSCOPE 2 |
beyond scope of source address | |
#define | ICMP6_DST_UNREACH_ADDR 3 |
address unreachable | |
#define | ICMP6_DST_UNREACH_NOPORT 4 |
port unreachable | |
ICMPv6 Time Exceeded message codes | |
#define | ICMP6_TIME_EXCEED_TRANSIT 0 |
ttl==0 in transit | |
#define | ICMP6_TIME_EXCEED_REASSEMBLY 1 |
ttl==0 in reass | |
ICMPv6 Parameter Problem message codes | |
#define | ICMP6_PARAMPROB_HEADER 0 |
erroneous header field | |
#define | ICMP6_PARAMPROB_NEXTHEADER 1 |
unrecognized next header | |
#define | ICMP6_PARAMPROB_OPTION 2 |
unrecognized option | |
ICMPv6 RFC4443 Message processing and sending | |
typedef void(* | uip_icmp6_echo_reply_callback_t )(uip_ipaddr_t *source, uint8_t ttl, uint8_t *data, uint16_t datalen) |
void | uip_icmp6_echo_request_input (void) |
\ brief Process an echo request More... | |
void | uip_icmp6_error_output (uint8_t type, uint8_t code, uint32_t param) |
Send an icmpv6 error message. More... | |
void | uip_icmp6_send (const uip_ipaddr_t *dest, int type, int code, int payload_len) |
Send an icmpv6 message. More... | |
void | uip_icmp6_echo_reply_input (void) |
\ brief Process an echo reply More... | |
void | uip_icmp6_echo_reply_callback_add (struct uip_icmp6_echo_reply_notification *n, uip_icmp6_echo_reply_callback_t c) |
Add a callback function for ping replies. More... | |
void | uip_icmp6_echo_reply_callback_rm (struct uip_icmp6_echo_reply_notification *n) |
Remove a callback function for ping replies. More... | |
Pointers to the header structures. | |
All pointers except UIP_IP_BUF depend on uip_ext_len, which at packet reception, is the total length of the extension headers. The pointer to ND6 options header also depends on nd6_opt_offset, which we set in each function. Care should be taken when manipulating these buffers about the value of these length variables | |
#define | UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) |
Pointer to IP header. | |
#define | UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[uip_l2_l3_hdr_len]) |
Pointer to ICMP header. | |
#define | UIP_ND6_RS_BUF ((uip_nd6_rs *)&uip_buf[uip_l2_l3_icmp_hdr_len]) |
#define | UIP_ND6_RA_BUF ((uip_nd6_ra *)&uip_buf[uip_l2_l3_icmp_hdr_len]) |
#define | UIP_ND6_NS_BUF ((uip_nd6_ns *)&uip_buf[uip_l2_l3_icmp_hdr_len]) |
#define | UIP_ND6_NA_BUF ((uip_nd6_na *)&uip_buf[uip_l2_l3_icmp_hdr_len]) |
Layer 2 variables | |
uip_lladdr_t | uip_lladdr = {{0x00,0x06,0x98,0x00,0x02,0x32}} |
Host L2 address. | |
Layer 3 variables | |
uint8_t * | uip_next_hdr |
Type of the next header in IPv6 header or extension headers. More... | |
uint8_t | uip_ext_bitmap = 0 |
bitmap we use to record which IPv6 headers we have already seen | |
uint8_t | uip_ext_len = 0 |
length of the extension headers read. More... | |
uint8_t | uip_ext_opt_offset = 0 |
length of the header options read | |
Buffer defines | |
#define | FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0]) |
#define | UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) |
#define | UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[uip_l2_l3_hdr_len]) |
#define | UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[UIP_LLH_LEN + UIP_IPH_LEN]) |
#define | UIP_TCP_BUF ((struct uip_tcp_hdr *)&uip_buf[UIP_LLH_LEN + UIP_IPH_LEN]) |
#define | UIP_EXT_BUF ((struct uip_ext_hdr *)&uip_buf[uip_l2_l3_hdr_len]) |
#define | UIP_ROUTING_BUF ((struct uip_routing_hdr *)&uip_buf[uip_l2_l3_hdr_len]) |
#define | UIP_FRAG_BUF ((struct uip_frag_hdr *)&uip_buf[uip_l2_l3_hdr_len]) |
#define | UIP_HBHO_BUF ((struct uip_hbho_hdr *)&uip_buf[uip_l2_l3_hdr_len]) |
#define | UIP_DESTO_BUF ((struct uip_desto_hdr *)&uip_buf[uip_l2_l3_hdr_len]) |
#define | UIP_EXT_HDR_OPT_BUF ((struct uip_ext_hdr_opt *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset]) |
#define | UIP_EXT_HDR_OPT_PADN_BUF ((struct uip_ext_hdr_opt_padn *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset]) |
#define | UIP_EXT_HDR_OPT_RPL_BUF ((struct uip_ext_hdr_opt_rpl *)&uip_buf[uip_l2_l3_hdr_len + uip_ext_opt_offset]) |
#define | UIP_ICMP6_ERROR_BUF ((struct uip_icmp6_error *)&uip_buf[uip_l2_l3_icmp_hdr_len]) |
Buffer variables | |
uip_buf_t | uip_aligned_buf |
Packet buffer for incoming and outgoing packets. | |
void * | uip_appdata |
Pointer to the application data in the packet buffer. More... | |
void * | uip_sappdata |
uint16_t | uip_len |
The length of the packet in the uip_buf buffer. More... | |
uint16_t | uip_slen |
General variables | |
uint8_t | uip_flags |
struct uip_conn * | uip_conn |
Pointer to the current TCP connection. More... | |
TCP defines | |
#define | TCP_FIN 0x01 |
#define | TCP_SYN 0x02 |
#define | TCP_RST 0x04 |
#define | TCP_PSH 0x08 |
#define | TCP_ACK 0x10 |
#define | TCP_URG 0x20 |
#define | TCP_CTL 0x3f |
#define | TCP_OPT_END 0 /* End of TCP options list */ |
#define | TCP_OPT_NOOP 1 /* "No-operation" TCP option */ |
#define | TCP_OPT_MSS 2 /* Maximum segment size TCP option */ |
#define | TCP_OPT_MSS_LEN 4 /* Length of TCP MSS option. */ |
The uIP IPv6 stack provides new Internet communication abilities to Contiki.
This document describes Ipv6 specific features. For features that are common to the IPv4 and IPv6 code please refer to uIP.
Ipv6 is to replace IPv4 in a near future. Indeed, to move to a real Internet of Things a larger address space is required. This extended address space (2^128 instead of 2^32) is one of the key features of IPv6 together with its simplified header format, its improved support for extensions and options, and its new QoS and security capabilities.
The uip IPv6 stack implementation targets constrained devices such as sensors. The code size is around 11.5Kbyte and the RAM usage around 1.7Kbyte (see below for more detailed information). Our implementation follows closely RFC 4294 IPv6 Node Requirements whose goal is to allow "IPv6 to function well and interoperate in a large number of situations and deployments".
The implementation currently does not support any router features (it does not forward packets, send RAs...)
This section gives a short overview of the different protocols that are part of the uIP IPv6 stack. A complete description can be found in the corresponding IETF standards which are available at http://www.ietf.org/rfc.html.
The IP packets are processed in the uip_process function. After a few validity checks on the IPv6 header, the extension headers are processed until an upper layer (ICMPv6, UDP or TCP) header is found. We support 4 extension headers:
The IPv6 header, extension headers, and options are defined in uip.h.
Although we can receive packets with the extension headers listed above, we do not offer support to send packets with extension headers.
Fragment Reassembly
This part of the code is very similar to the IPv4 fragmentation code. The only difference is that the fragmented packet is not assumed to be a TCP packet. As a result, we use a different timer to time-out reassembly if all fragments have not been received after UIP_REASS_MAXAGE = 60s.
An IPv6 address has 128 bits and is defined as follows:
We assume that each node has a single interface of type #uip_netif.
Each interface can have up to #UIP_NETIF_MAX_ADDRESSES unicast IPv6 addresses including its link-local address. It also has a solicited-node multicast address. We assume that the unicast addresses are obtained via stateless address autoconfiguration so that the solicited-node address is the same for all the unicast addresses. Indeed, the solicited-node multicast address is formed by combining the prefix FF02::1:FF00:0/104 and the last 24-bits of the corresponding IPv6 address. When using stateless address autoconfiguration these bits are always equal to the last 24-bits of the link-layer address.
We do not support applications using multicast. Nevertheless, our node should join the all-nodes multicast address, as well as its solicited-node multicast address. Joining the all-nodes multicast address does not require any action. Joining the solicited-node multicast address is done using Multicast Listener Discovery (MLD or MLDv2). More exactly, the node should send a MLD report packet. However this step can be safely skipped and we do so.
"IPv6 nodes on the same link use Neighbor Discovery to discover each other's presence, to determine each other's link-layer addresses, to find routers, and to maintain reachability information about the paths to active neighbors" (citation from the abstract of RFC 4861).
Neighbor Discovery (ND) replaces ARP in IPv4 but does much more.
Neighbor discovery messages
The structures corresponding to the different message headers and options are in uip-nd6.h. The functions used to send / process this messages are also described in uip-nd6.h although the actual code is in uip-nd6-io.c.
Neighbor discovery structures
We use the following neighbor discovery structures (declared in uip-nd6.c):
Each of this structure has its own add, remove and lookup functions. To update an entry in a ND structure, we first do a lookup to obtain a pointer to the entry, we then directly modify the different entry fields.
Neighbor discovery processes
RFC 4862 defines two main processes:
When an interface becomes active, its link-local address is created by combining the FE80::0/64 prefix and the interface ID. DAD is then performed for this link-local address. Available routers are discovered by sending up to #UIP_ND6_MAX_RTR_SOLICITATIONS RS packets. Address autoconfiguration is then performed based on the prefix information received in the RA. The interface initialization is performed in #uip_netif_init.
We support ICMPv6 Error messages as well as Echo Reply and Echo Request messages. The application used for sending Echo Requests (see ping6.c) is not part of the IP stack.
The ICMPv6 message headers and constants are defined in uip-icmp6.h.
The IPv6 stack (like the IPv4 stack) is a Contiki process
In addition to the periodic timer that is used by TCP, five IPv6 specific timers are attached to this process:
Both #uip_nd6_timer_periodic and #uip_netif_timer_periodic run continuously. This could be avoided by using callback timers to handle ND and Netif structures timeouts.
This section just lists all IPv6 related compile time flags. Each flag function is documented in this page in the appropriate section.
The IPv6 code uses the same single global buffer as the IPv4 code. This buffer should be large enough to contain one packet of maximum size, i.e., UIP_LINK_MTU = 1280 bytes. When fragment reassembly is enabled an additional buffer of the same size is used.
The only difference with the IPv4 code is the per neighbor buffering that is available when #UIP_CONF_QUEUE_PKT is set to 1. This additional buffering is used to queue one packet per neighbor while performing address resolution for it. This is a very costly feature as it increases the RAM usage by approximately #UIP_ND6_MAX_NEIGHBORS * UIP_LINK_MTU bytes.
The total IPv6 code size is approximately 11.5Kbyte and the RAM usage around 1.8Kbyte. For an additional NEIGHBOR count 35bytes, 25 for an additional PREFIX, 7 for an additional DEFROUTER, and 25 for an additional ADDRESS.
The IPv6 stack can potentially run on very different link layers (ethernet, 802.15.4, 802.11, etc). The link-layer influences the following IP layer objects:
Moreover, tcpip_output should point to the link-layer function used to send a packet. Similarly, the link-layer should call tcpip_input when an IP packet is received.
The code corresponding to the desired link layer is selected at compilation time (see for example the #UIP_LL_802154 flag).
The TCP and the UDP protocol are part of the uIP stack and were left unchanged by the IPv6 implementation. For the application layer, please refer to the application program interface.
This section describes which parts of RFC4294 we are compliant with. For each section, we put between brackets the requirement level.
When all IPv6 related compile flags are set, our stack is fully compliant with RFC4294 (i.e. we implemement all the MUSTs), except for MLD support and redirect function support.
Sub IP layer
We support RFC2464 transmission of IPv6 packets over Ethernet
We will soon support RFC4944 transmission of IPv6 packets over 802.15.4
IP layer
DNS (RFC 1034, 1035, 3152, 3363, 3596) and DHCPv6 (RFC 3315) (conditional MUST)
no support
IPv4 Transition mechanisms RFC 4213 (conditional MUST)
no support
Mobile IP RFC 3775 (MAY / SHOULD)
no support
IPSec RFC 4301 4302 4303 2410 2404 2451 3602(MUSTs) 4305 (SHOULD)
no support
SNMP (MAY)
no support
IPv6ready is the certification authority for IPv6 implementations (http://www.ipv6ready.org). It delivers two certificates (phase 1 and phase 2).
When all the IPv6 related compile flags are set, we pass all the tests for phase 1.
We pass all the tests for phase 2 except:
#define UIP_ND6_RS_BUF ((uip_nd6_rs *)&uip_buf[uip_l2_l3_icmp_hdr_len]) |
enum rpl_mode rpl_get_mode | ( | void | ) |
uint16_t uip_chksum | ( | uint16_t * | buf, |
uint16_t | len | ||
) |
Calculate the Internet checksum over a buffer.
The Internet checksum is the one's complement of the one's complement sum of all 16-bit words in the buffer.
See RFC1071.
buf | A pointer to the buffer over which the checksum is to be computed. |
len | The length of the buffer over which the checksum is to be computed. |
Definition at line 335 of file uip6.c.
References uip_htons().
uip_ds6_nbr_t* uip_ds6_get_least_lifetime_neighbor | ( | void | ) |
This searches inside the neighbor table for the neighbor that is about to expire the next.
Definition at line 280 of file uip-ds6-nbr.c.
References NULL, and stimer_remaining().
uip_ds6_nbr_t* uip_ds6_nbr_add | ( | const uip_ipaddr_t * | ipaddr, |
const uip_lladdr_t * | lladdr, | ||
uint8_t | isrouter, | ||
uint8_t | state | ||
) |
Adds a neighbor to the neighbor cache.
ipaddr | IP address of the neighbor to add. |
lladdr | Link-local address of the neighbor (may be unknown when added), NULL if not known (requires state to be set to NBR_INCOMPLETE) |
isrouter | Set to 1 if neighbor is a router, to 0 if host or unknown |
state | State of this entry. Possible values are: NBR_INCOMPLETE, NBR_REACHABLE, NBR_STALE, NBR_DELAY, NBR_PROBE |
Definition at line 80 of file uip-ds6-nbr.c.
References NULL, stimer_set(), and uip_ipaddr_copy.
Referenced by tcpip_ipv6_output(), uip_nd6_ns_input(), and uip_nd6_ra_input().
uip_ipaddr_t* uip_ds6_nbr_ipaddr_from_lladdr | ( | const uip_lladdr_t * | lladdr | ) |
Returns IP address associated with link-local address, based on neighbor cache entry.
Definition at line 178 of file uip-ds6-nbr.c.
References NULL, and uip_ds6_nbr_ll_lookup().
uip_ds6_nbr_t* uip_ds6_nbr_ll_lookup | ( | const uip_lladdr_t * | lladdr | ) |
Lookup if a neighbor cache entry for given link-layer address exists.
llpaddr | link-layer address to look up |
Definition at line 171 of file uip-ds6-nbr.c.
Referenced by uip_ds6_link_neighbor_callback(), and uip_ds6_nbr_ipaddr_from_lladdr().
const uip_lladdr_t* uip_ds6_nbr_lladdr_from_ipaddr | ( | const uip_ipaddr_t * | ipaddr | ) |
Returns link-layer address associated with IP address, based on neighbor cache entry.
Definition at line 186 of file uip-ds6-nbr.c.
References NULL, uip_ds6_nbr_get_ll(), and uip_ds6_nbr_lookup().
Referenced by uip_ds6_route_add().
uip_ds6_nbr_t* uip_ds6_nbr_lookup | ( | const uip_ipaddr_t * | ipaddr | ) |
Lookup if a neighbor cache entry for given IP address exists.
ipaddr | IP address to look up |
Definition at line 156 of file uip-ds6-nbr.c.
References NULL.
Referenced by tcpip_ipv6_output(), uip_ds6_defrt_choose(), uip_ds6_nbr_lladdr_from_ipaddr(), uip_nd6_na_input(), uip_nd6_ns_input(), and uip_nd6_ra_input().
void uip_ds6_neighbors_init | ( | void | ) |
Initialize neighbor cache.
Definition at line 74 of file uip-ds6-nbr.c.
References uip_ds6_nbr_rm().
Referenced by uip_ds6_init().
uint16_t uip_htons | ( | uint16_t | val | ) |
Convert a 16-bit quantity from host byte order to network byte order.
This function is primarily used for converting variables from host byte order to network byte order. For converting constants to network byte order, use the UIP_HTONS() macro instead.
Definition at line 2347 of file uip6.c.
References UIP_HTONS.
Referenced by mac_LowpanToEthernet(), roll_tm_icmp_input(), uip_chksum(), and uip_ipchksum().
void uip_icmp6_echo_reply_callback_add | ( | struct uip_icmp6_echo_reply_notification * | n, |
uip_icmp6_echo_reply_callback_t | c | ||
) |
Add a callback function for ping replies.
n | A struct uip_icmp6_echo_reply_notification that must have been allocated by the caller |
c | A pointer to the callback function to be called This function adds a callback function to the list of callback functions that are called when an ICMP echo reply (ping reply) is received. This is used when implementing a ping protocol: attach a callback function to the ping reply, then send out a ping packet with uip_icmp6_send(). The caller must have statically allocated a struct uip_icmp6_echo_reply_notification to hold the internal state of the callback function. When a ping reply packet is received, all registered callback functions are called. The callback functions must not modify the contents of the uIP buffer. |
Definition at line 350 of file uip-icmp6.c.
References list_add(), and NULL.
void uip_icmp6_echo_reply_callback_rm | ( | struct uip_icmp6_echo_reply_notification * | n | ) |
Remove a callback function for ping replies.
n | A struct uip_icmp6_echo_reply_notification that must have been previously added with uip_icmp6_echo_reply_callback_add() This function removes a callback function from the list of callback functions that are called when an ICMP echo reply (ping reply) is received. |
Definition at line 360 of file uip-icmp6.c.
References list_remove().
void uip_icmp6_echo_reply_input | ( | void | ) |
\ brief Process an echo reply
Perform a few checks, then call applications to inform that an echo reply has been received.
Definition at line 279 of file uip-icmp6.c.
References list_head(), list_item_next(), NULL, uip_ext_len, UIP_ICMP_BUF, UIP_IP_BUF, uip_ipaddr_copy, and uip_len.
Referenced by uip_process().
void uip_icmp6_echo_request_input | ( | void | ) |
\ brief Process an echo request
Perform a few checks, then send an Echo reply. The reply is built here.
Definition at line 80 of file uip-icmp6.c.
References ICMP6_ECHO_REPLY, uip_ds6_select_src(), uip_ext_len, uip_icmp6chksum(), UIP_ICMP_BUF, UIP_IP_BUF, uip_ipaddr_copy, uip_is_addr_mcast, uip_len, and UIP_STAT.
Referenced by uip_process().
void uip_icmp6_error_output | ( | uint8_t | type, |
uint8_t | code, | ||
uint32_t | param | ||
) |
Send an icmpv6 error message.
type | type of the error message |
code | of the error message |
type | 32 bit parameter of the error message, semantic depends on error |
Definition at line 167 of file uip-icmp6.c.
References ICMP6_PARAM_PROB, ICMP6_PARAMPROB_OPTION, uip_ds6_select_src(), uip_ext_len, UIP_ICMP6_ERROR_LEN, uip_icmp6chksum(), UIP_ICMP_BUF, UIP_IP_BUF, uip_ipaddr_copy, uip_is_addr_mcast, uip_is_addr_unspecified, uip_len, UIP_LINK_MTU, and UIP_STAT.
Referenced by uip_process().
void uip_icmp6_send | ( | const uip_ipaddr_t * | dest, |
int | type, | ||
int | code, | ||
int | payload_len | ||
) |
Send an icmpv6 message.
dest | destination address of the message |
type | type of the message |
code | of the message |
payload_len | length of the payload |
Definition at line 254 of file uip-icmp6.c.
References tcpip_ipv6_output(), uip_ds6_select_src(), uip_icmp6chksum(), UIP_ICMP_BUF, UIP_IP_BUF, and uip_len.
uint16_t uip_icmp6chksum | ( | void | ) |
Calculate the ICMP checksum of the packet in uip_buf.
Definition at line 386 of file uip6.c.
Referenced by mac_translateIcmpLinkLayer(), uip_icmp6_echo_request_input(), uip_icmp6_error_output(), uip_icmp6_send(), uip_nd6_ns_input(), uip_nd6_ns_output(), uip_nd6_rs_output(), and uip_process().
void uip_init | ( | void | ) |
uIP initialization function.
This function should be called at boot up to initilize the uIP TCP/IP stack.
Definition at line 410 of file uip6.c.
References uip_udp_conn::lport, UIP_CONNS, uip_ds6_init(), UIP_LISTENPORTS, and UIP_UDP_CONNS.
uint16_t uip_ipchksum | ( | void | ) |
Calculate the IP header checksum of the packet header in uip_buf.
The IP header checksum is the Internet checksum of the 20 bytes of the IP header.
Definition at line 342 of file uip6.c.
References uip_htons(), and UIP_LLH_LEN.
void uip_process | ( | uint8_t | flag | ) |
process the options within a hop by hop or destination option header
0,: | nothing to send, |
1,: | drop pkt |
2,: | ICMP error message to send |
Call echo reply input function.
Definition at line 918 of file uip6.c.
References ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, ICMP6_DST_UNREACH_NOTNEIGHBOR, ICMP6_ECHO_REPLY, ICMP6_ECHO_REQUEST, ICMP6_NA, ICMP6_NS, ICMP6_PACKET_TOO_BIG, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, ICMP6_PARAMPROB_NEXTHEADER, ICMP6_RA, ICMP6_ROLL_TM, ICMP6_RPL, ICMP6_RS, ICMP6_TIME_EXCEED_TRANSIT, ICMP6_TIME_EXCEEDED, uip_conn::initialmss, uip_conn::len, uip_conn::lport, uip_udp_conn::lport, uip_conn::mss, uip_conn::nrtx, NULL, uip_conn::rcv_nxt, uip_conn::ripaddr, uip_udp_conn::ripaddr, roll_tm_icmp_input(), uip_conn::rport, uip_udp_conn::rport, uip_conn::rto, uip_conn::sa, uip_conn::snd_nxt, uip_conn::sv, uip_conn::tcpstateflags, uip_conn::timer, uip_udp_conn::ttl, uip_add32(), UIP_APPCALL, uip_appdata, uip_conn, UIP_CONNS, uip_ds6_is_my_addr, uip_ds6_is_my_maddr, uip_ds6_select_src(), uip_ext_bitmap, UIP_EXT_HDR_BITMAP_HBHO, uip_ext_len, UIP_HTONS, uip_icmp6_echo_reply_input(), uip_icmp6_echo_request_input(), uip_icmp6_error_output(), uip_icmp6chksum(), UIP_ICMP_BUF, UIP_IP_BUF, uip_ipaddr_copy, uip_is_addr_link_local, uip_is_addr_loopback, uip_is_addr_mcast, uip_is_addr_mcast_routable, uip_is_addr_unspecified, uip_len, UIP_LINK_MTU, UIP_LISTENPORTS, UIP_LLH_LEN, UIP_MAXRTX, UIP_MAXSYNRTX, uip_nd6_na_input(), uip_nd6_ns_input(), uip_nd6_ra_input(), uip_next_hdr, UIP_PROTO_HBHO, UIP_RECEIVE_WINDOW, UIP_RTO, UIP_STAT, UIP_TCP_MSS, uip_tcpchksum(), UIP_TIME_WAIT_TIMEOUT, uip_udp_conn, UIP_UDP_CONNS, and uip_udpchksum().
void uip_send | ( | const void * | data, |
int | len | ||
) |
Send data on the current connection.
This function is used to send out a single segment of TCP data. Only applications that have been invoked by uIP for event processing can send data.
The amount of data that actually is sent out after a call to this function is determined by the maximum amount of data TCP allows. uIP will automatically crop the data so that only the appropriate amount of data is sent. The function uip_mss() can be used to query uIP for the amount of data that actually will be sent.
data | A pointer to the data which is to be sent. |
len | The maximum amount of data bytes to be sent. |
Definition at line 2359 of file uip6.c.
References NULL, UIP_BUFSIZE, and UIP_LLH_LEN.
void* uip_appdata |
Pointer to the application data in the packet buffer.
This pointer points to the application data when the application is called. If the application wishes to send data, the application may use this space to write the data into before calling uip_send().
Definition at line 173 of file uip6.c.
Referenced by slipdev_send(), uip_arp_out(), uip_fw_forward(), uip_process(), uip_split_output(), and uip_tcpchksum().
uint8_t uip_ext_len = 0 |
length of the extension headers read.
The length of the extension headers.
updated each time we process a header
Definition at line 136 of file uip6.c.
Referenced by roll_tm_icmp_input(), tcpip_input(), tcpip_ipv6_output(), uip_icmp6_echo_reply_input(), uip_icmp6_echo_request_input(), uip_icmp6_error_output(), uip_nd6_ns_input(), uip_nd6_ns_output(), and uip_process().
uint16_t uip_len |
The length of the packet in the uip_buf buffer.
The global variable uip_len holds the length of the packet in the uip_buf buffer.
When the network device driver calls the uIP input function, uip_len should be set to the length of the packet in the uip_buf buffer.
When sending packets, the device driver should use the contents of the uip_len variable to determine the length of the outgoing packet.
Definition at line 184 of file uip6.c.
Referenced by mac_ethernetToLowpan(), mac_LowpanToEthernet(), mac_translateIcmpLinkLayer(), roll_tm_icmp_input(), slipdev_send(), tcpip_input(), tcpip_ipv6_output(), uip_arp_arpin(), uip_arp_out(), uip_ds6_neighbor_periodic(), uip_ds6_periodic(), uip_fw_forward(), uip_fw_output(), uip_icmp6_echo_reply_input(), uip_icmp6_echo_request_input(), uip_icmp6_error_output(), uip_icmp6_send(), uip_nd6_na_input(), uip_nd6_ns_input(), uip_nd6_ns_output(), uip_nd6_ra_input(), uip_nd6_rs_output(), uip_process(), and uip_split_output().
uint8_t* uip_next_hdr |
Type of the next header in IPv6 header or extension headers.
Can be the next header field in the IPv6 header or in an extension header. When doing fragment reassembly, we must change the value of the next header field in the header before the fragmentation header, hence we need a pointer to this field.
Definition at line 129 of file uip6.c.
Referenced by uip_process().