Contiki 3.x
|
The uIP IPv6 stack provides new Internet communication abilities to Contiki. More...
Files | |
file | uip-ds6.h |
Network interface and stateless autoconfiguration (RFC 4862) | |
Data Structures | |
struct | uip_ds6_nbr |
An entry in the nbr cache. More... | |
struct | uip_ds6_prefix |
A prefix list entry. More... | |
struct | uip_ds6_addr |
Unicast address structure. More... | |
struct | uip_ds6_aaddr |
Anycast address. More... | |
struct | uip_ds6_maddr |
A multicast address. More... | |
struct | uip_ds6_netif |
Interface structure (contains all the interface variables) More... | |
struct | uip_ds6_element |
Generic type for a DS6, to use a common loop though all DS. More... | |
struct | uip_icmp6_error |
ICMPv6 Error message constant part. More... | |
struct | uip_nd6_ns |
A neighbor solicitation constant part. More... | |
struct | uip_nd6_na |
A neighbor advertisement constant part. More... | |
struct | uip_nd6_rs |
A router solicitation constant part. More... | |
struct | uip_nd6_ra |
A router advertisement constant part. More... | |
struct | uip_nd6_redirect |
A redirect message constant part. More... | |
struct | uip_nd6_opt_hdr |
ND option header. More... | |
struct | uip_nd6_opt_prefix_info |
ND option prefix information. More... | |
struct | uip_nd6_opt_mtu |
ND option MTU. More... | |
Macros | |
#define | NBR_INCOMPLETE 0 |
Possible states for the nbr cache entries. | |
#define | UIP_DS6_DEFRT_NBS 0 |
Configuration. More... | |
#define | ADDR_TENTATIVE 0 |
Possible states for the an address (RFC 4862) | |
#define | ADDR_ANYTYPE 0 |
How the address was acquired: Autoconf, DHCP or manually. | |
#define | UIP_DS6_PERIOD (CLOCK_SECOND/10) |
General DS6 definitions. More... | |
#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. | |
#define | UIP_ND6_DEF_MAXDADNS UIP_ND6_SEND_NA |
Do not try DAD when using EUI-64 as allowed by draft-ietf-6lowpan-nd-15 section 8.2. | |
Typedefs | |
typedef struct uip_ds6_nbr | uip_ds6_nbr_t |
An entry in the nbr cache. | |
typedef struct uip_ds6_prefix | uip_ds6_prefix_t |
A prefix list entry. | |
typedef struct uip_ds6_addr | uip_ds6_addr_t |
Unicast address structure. More... | |
typedef struct uip_ds6_aaddr | uip_ds6_aaddr_t |
Anycast address. | |
typedef struct uip_ds6_maddr | uip_ds6_maddr_t |
A multicast address. | |
typedef struct uip_ds6_netif | uip_ds6_netif_t |
Interface structure (contains all the interface variables) | |
typedef struct uip_ds6_element | uip_ds6_element_t |
Generic type for a DS6, to use a common loop though all DS. | |
typedef struct uip_icmp6_error | uip_icmp6_error |
ICMPv6 Error message constant part. | |
Functions | |
uip_ds6_nbr_t * | uip_ds6_nbr_add (const uip_ipaddr_t *ipaddr, const uip_lladdr_t *lladdr, uint8_t isrouter, uint8_t state) |
Neighbor Cache basic routines. | |
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... | |
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... | |
Variables | |
struct etimer | uip_ds6_timer_rs |
Timer for maintenance of data structures. | |
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) |
typedef struct uip_icmp6_input_handler | uip_icmp6_input_handler_t |
uint8_t | uip_icmp6_input (uint8_t type, uint8_t icode) |
Handle an incoming ICMPv6 message. More... | |
void | uip_icmp6_register_input_handler (uip_icmp6_input_handler_t *handler) |
Register a handler which can handle a specific ICMPv6 message type. 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_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... | |
void | uip_icmp6_init (void) |
Initialise the uIP ICMPv6 core. | |
#define | UIP_ICMP6_INPUT_SUCCESS 0 |
#define | UIP_ICMP6_INPUT_ERROR 1 |
#define | UIP_ICMP6_HANDLER_CODE_ANY 0xFF /* Handle all codes for this type */ |
#define | UIP_ICMP6_HANDLER(name, type, code, func) static uip_icmp6_input_handler_t name = { NULL, type, code, func } |
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]) |
General | |
#define | UIP_ND6_HOP_LIMIT 255 |
HOP LIMIT to be used when sending ND messages (255) | |
#define | UIP_ND6_INFINITE_LIFETIME 0xFFFFFFFF |
INFINITE lifetime. | |
RFC 4861 Host constant | |
#define | UIP_ND6_MAX_RTR_SOLICITATION_DELAY 1 |
#define | UIP_ND6_RTR_SOLICITATION_INTERVAL 4 |
#define | UIP_ND6_MAX_RTR_SOLICITATIONS 3 |
ND6 message length (excluding options) | |
#define | UIP_ND6_NA_LEN 20 |
#define | UIP_ND6_NS_LEN 20 |
#define | UIP_ND6_RA_LEN 12 |
#define | UIP_ND6_RS_LEN 4 |
ND6 option length in bytes | |
#define | UIP_ND6_OPT_HDR_LEN 2 |
#define | UIP_ND6_OPT_PREFIX_INFO_LEN 32 |
#define | UIP_ND6_OPT_MTU_LEN 8 |
#define | UIP_ND6_OPT_LLAO_LEN 8 |
length of a ND6 LLAO option for default L2 type (e.g. More... | |
ND message structures | |
typedef struct uip_nd6_ns | uip_nd6_ns |
A neighbor solicitation constant part. More... | |
typedef struct uip_nd6_na | uip_nd6_na |
A neighbor advertisement constant part. More... | |
typedef struct uip_nd6_rs | uip_nd6_rs |
A router solicitation constant part. More... | |
typedef struct uip_nd6_ra | uip_nd6_ra |
A router advertisement constant part. More... | |
typedef struct uip_nd6_redirect | uip_nd6_redirect |
A redirect message constant part. More... | |
ND Option structures | |
typedef struct uip_nd6_opt_hdr | uip_nd6_opt_hdr |
ND option header. | |
typedef struct uip_nd6_opt_prefix_info | uip_nd6_opt_prefix_info |
ND option prefix information. | |
typedef struct uip_nd6_opt_mtu | uip_nd6_opt_mtu |
ND option MTU. | |
typedef struct uip_nd6_opt_redirected_hdr | uip_nd6_opt_redirected_hdr |
ND Messages Processing and Generation | |
void | uip_nd6_ns_output (uip_ipaddr_t *src, uip_ipaddr_t *dest, uip_ipaddr_t *tgt) |
Send a neighbor solicitation, send a Neighbor Advertisement. More... | |
void | uip_nd6_rs_output (void) |
Send a Router Solicitation. More... | |
void | uip_nd6_init (void) |
Initialise the uIP ND core. | |
void | uip_nd6_ns_input (void) |
Process a neighbor solicitation. More... | |
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... | |
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:
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.
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_DS6_DEFRT_NBS 0 |
Configuration.
For all tables (Neighbor cache, Prefix List, Routing Table, Default Router List, Unicast address list, multicast address list, anycast address list), we define:
#define UIP_DS6_PERIOD (CLOCK_SECOND/10) |
General DS6 definitions.
Period for uip-ds6 periodic task
Definition at line 136 of file uip-ds6.h.
Referenced by uip_ds6_init().
#define UIP_ND6_OPT_LLAO_LEN 8 |
length of a ND6 LLAO option for default L2 type (e.g.
Ethernet)
Definition at line 175 of file uip-nd6.h.
Referenced by uip_nd6_ns_output(), and uip_nd6_rs_output().
#define UIP_ND6_RS_BUF ((uip_nd6_rs *)&uip_buf[uip_l2_l3_icmp_hdr_len]) |
typedef struct uip_ds6_addr uip_ds6_addr_t |
Unicast address structure.
typedef struct uip_nd6_na uip_nd6_na |
A neighbor advertisement constant part.
Possible option is: TLLAO
typedef struct uip_nd6_ns uip_nd6_ns |
A neighbor solicitation constant part.
Possible option is: SLLAO
typedef struct uip_nd6_ra uip_nd6_ra |
A router advertisement constant part.
Possible options are: SLLAO, MTU, Prefix Information
typedef struct uip_nd6_redirect uip_nd6_redirect |
A redirect message constant part.
Possible options are: TLLAO, redirected header
typedef struct uip_nd6_rs uip_nd6_rs |
A router solicitation constant part.
Possible option is: SLLAO
enum rpl_mode rpl_get_mode | ( | void | ) |
enum rpl_mode rpl_set_mode | ( | enum rpl_mode | mode | ) |
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 336 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 281 of file uip-ds6-nbr.c.
References NULL, and stimer_remaining().
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 2298 of file uip6.c.
References UIP_HTONS.
Referenced by mac_LowpanToEthernet(), 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 395 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 405 of file uip-icmp6.c.
References list_remove().
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 210 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().
uint8_t uip_icmp6_input | ( | uint8_t | type, |
uint8_t | icode | ||
) |
Handle an incoming ICMPv6 message.
type | The ICMPv6 message type |
icode | The ICMPv6 message code |
Generic handler for unknown ICMPv6 types. It will lookup for a registered function capable of handing this message type. The function must have first been registered with uip_icmp6_register_input_handler. The function is in charge of setting uip_len to 0, otherwise the uIPv6 core will attempt to send whatever remains in the UIP_IP_BUF.
A return value of UIP_ICMP6_INPUT_ERROR means that a handler could not be invoked. This is most likely because the ICMPv6 type does not have a valid handler associated with it.
UIP_ICMP6_INPUT_SUCCESS signifies that a handler was found for this ICMPv6 type and that it was invoked. It does NOT provide any indication whatsoever regarding whether the handler itself succeeded.
Definition at line 100 of file uip-icmp6.c.
References NULL.
Referenced by uip_process().
void uip_icmp6_register_input_handler | ( | uip_icmp6_input_handler_t * | handler | ) |
Register a handler which can handle a specific ICMPv6 message type.
handler | A pointer to the handler |
Definition at line 117 of file uip-icmp6.c.
References list_add().
Referenced by uip_icmp6_init(), and uip_nd6_init().
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 297 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 387 of file uip6.c.
Referenced by mac_translateIcmpLinkLayer(), uip_icmp6_error_output(), uip_icmp6_send(), 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 411 of file uip6.c.
References uip_udp_conn::lport, UIP_CONNS, uip_ds6_init(), uip_icmp6_init(), UIP_LISTENPORTS, uip_nd6_init(), 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 343 of file uip6.c.
References uip_htons(), and UIP_LLH_LEN.
void uip_nd6_ns_input | ( | void | ) |
Process a neighbor solicitation.
The NS can be received in 3 cases (procedures):
We do:
If we need to send a NA in response (i.e. the NS was done for NUD, or address resolution, or DAD and there is a conflict), we do it in this function: set src, dst, tgt address in the three cases, then for all cases set the rest, including SLLAO
void uip_nd6_ns_output | ( | uip_ipaddr_t * | src, |
uip_ipaddr_t * | dest, | ||
uip_ipaddr_t * | tgt | ||
) |
Send a neighbor solicitation, send a Neighbor Advertisement.
src | pointer to the src of the NS if known |
dest | pointer to ip address to send the NS, for DAD or ADDR Resol, MUST be NULL, for NUD, must be correct unicast dest |
tgt | pointer to ip address to fill the target address field, must not be NULL |
Definition at line 328 of file uip-nd6.c.
References ICMP6_NS, NULL, uip_create_solicited_node, uip_create_unspecified, uip_ds6_select_src(), uip_ext_len, uip_icmp6chksum(), UIP_ICMP_BUF, UIP_IP_BUF, uip_ipaddr_copy, uip_is_addr_unspecified, uip_len, UIP_ND6_HOP_LIMIT, UIP_ND6_OPT_LLAO_LEN, and UIP_STAT.
Referenced by tcpip_ipv6_output().
void uip_nd6_rs_output | ( | void | ) |
Send a Router Solicitation.
src is chosen through the uip_netif_select_src function. If src is unspecified (i.e. we do not have a preferred address yet), then we do not put a SLLAO option (MUST NOT in RFC 4861). Otherwise we do.
RS message format, possible option is SLLAO, MUST NOT be included if source = unspecified SHOULD be included otherwise
Definition at line 740 of file uip-nd6.c.
References ICMP6_RS, uip_create_linklocal_allrouters_mcast, uip_ds6_select_src(), uip_icmp6chksum(), UIP_ICMP_BUF, UIP_IP_BUF, uip_is_addr_unspecified, uip_len, UIP_ND6_HOP_LIMIT, UIP_ND6_OPT_LLAO_LEN, and UIP_STAT.
Referenced by uip_ds6_send_rs().
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 |
Definition at line 921 of file uip6.c.
References ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, ICMP6_DST_UNREACH_NOTNEIGHBOR, ICMP6_PACKET_TOO_BIG, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, ICMP6_PARAMPROB_NEXTHEADER, 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, 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_select_src(), uip_ext_bitmap, UIP_EXT_HDR_BITMAP_HBHO, uip_ext_len, UIP_HTONS, uip_icmp6_error_output(), uip_icmp6_input(), 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_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 2310 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().
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 137 of file uip6.c.
Referenced by tcpip_input(), tcpip_ipv6_output(), uip_icmp6_error_output(), 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.
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 130 of file uip6.c.
Referenced by uip_process().