IPv6 layer.
#include "lwip/opt.h"
#include "lwip/def.h"
#include "lwip/mem.h"
#include "lwip/netif.h"
#include "lwip/ip6.h"
#include "lwip/ip6_addr.h"
#include "lwip/ip6_frag.h"
#include "lwip/icmp6.h"
#include "lwip/raw.h"
#include "lwip/udp.h"
#include "lwip/tcp_impl.h"
#include "lwip/dhcp6.h"
#include "lwip/nd6.h"
#include "lwip/mld6.h"
#include "lwip/debug.h"
#include "lwip/stats.h"
Functions | |
err_t | ip6_input (struct pbuf *p, struct netif *inp) |
This function is called by the network interface device driver when an IPv6 packet is received. More... | |
err_t | ip6_options_add_hbh_ra (struct pbuf *p, u8_t nexth, u8_t value) |
Add a hop-by-hop options header with a router alert option and padding. More... | |
err_t | ip6_output (struct pbuf *p, ip6_addr_t *src, ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth) |
Simple interface to ip6_output_if. More... | |
err_t | ip6_output_if (struct pbuf *p, ip6_addr_t *src, ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif) |
Sends an IPv6 packet on a network interface. More... | |
err_t | ip6_output_if_src (struct pbuf *p, ip6_addr_t *src, ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif) |
Same as ip6_output_if() but 'src' address is not replaced by netif address when it is 'any'. More... | |
struct netif * | ip6_route (struct ip6_addr *src, struct ip6_addr *dest) |
Finds the appropriate network interface for a given IPv6 address. More... | |
ip6_addr_t * | ip6_select_source_address (struct netif *netif, ip6_addr_t *dest) |
Select the best IPv6 source address for a given destination IPv6 address. More... | |
This function is called by the network interface device driver when an IPv6 packet is received.
The function does the basic checks of the IP header such as packet size being at least larger than the header size etc. If the packet was not destined for us, the packet is forwarded (using ip6_forward).
Finally, the packet is sent to the upper layer protocol input function.
p | the received IPv6 packet (p->payload points to IPv6 header) |
inp | the netif on which this packet was received |
References ip_globals::current_ip6_header, ip_globals::current_ip_header_tot_len, ip_globals::current_iphdr_dest, ip_globals::current_iphdr_src, ip_globals::current_netif, ERR_OK, icmp6_input(), icmp6_param_problem(), ICMP6_PP_HEADER, if(), ipX_addr_t::ip6, ip6_addr_cmp, ip6_addr_cmp_solicitednode, ip6_addr_copy, ip6_addr_isallnodes_iflocal, ip6_addr_isallnodes_linklocal, ip6_addr_isany, ip6_addr_islinklocal, ip6_addr_ismulticast, ip6_addr_issolicitednode, ip6_addr_isvalid, ip6_addr_set_any, ip6_current_dest_addr, ip6_current_src_addr, ip6_debug_print, IP6_FRAG_MORE_FLAG, IP6_FRAG_OFFSET_MASK, IP6_FRAG_STATS_INC, IP6_HLEN, IP6_NEXTH_DESTOPTS, IP6_NEXTH_FRAGMENT, IP6_NEXTH_HOPBYHOP, IP6_NEXTH_ICMP6, IP6_NEXTH_NONE, IP6_NEXTH_ROUTING, IP6_NEXTH_TCP, IP6_NEXTH_UDP, IP6_NEXTH_UDPLITE, ip6_reass(), IP6_STATS_INC, IP6H_NEXTH, IP6H_PLEN, IP6H_V, ip_data, pbuf::len, LWIP_DBG_LEVEL_SERIOUS, LWIP_DBG_LEVEL_WARNING, LWIP_DBG_TRACE, LWIP_DEBUGF, mld6_lookfor_group(), netif::name, netif_ip6_addr, netif_ip6_addr_state, netif_is_up, netif_list, netif::next, NULL, pbuf::payload, pbuf_free(), pbuf_header(), pbuf_realloc(), raw_input(), tcp_input(), pbuf::tot_len, U16_F, U32_F, and udp_input().
Referenced by ethernet_input(), and tcpip_thread().
Add a hop-by-hop options header with a router alert option and padding.
Used by MLD when sending a Multicast listener report/done message.
p | the packet to which we will prepend the options header |
nexth | the next header protocol number (e.g. IP6_NEXTH_ICMP6) |
value | the value of the router alert option data (e.g. IP6_ROUTER_ALERT_VALUE_MLD) |
References ERR_BUF, ERR_OK, IP6_PADN_ALERT_OPTION, IP6_ROUTER_ALERT_OPTION, IP6_STATS_INC, LWIP_DEBUGF, pbuf::payload, and pbuf_header().
Referenced by mld6_send().
err_t ip6_output | ( | struct pbuf * | p, |
ip6_addr_t * | src, | ||
ip6_addr_t * | dest, | ||
u8_t | hl, | ||
u8_t | tc, | ||
u8_t | nexth | ||
) |
Simple interface to ip6_output_if.
It finds the outgoing network interface and calls upon ip6_output_if to do the actual work.
p | the packet to send (p->payload points to the data, e.g. next protocol header; if dest == IP_HDRINCL, p already includes an IPv6 header and p->payload points to that IPv6 header) |
src | the source IPv6 address to send from (if src == IP6_ADDR_ANY, an IP address of the netif is selected and used as source address. if src == NULL, IP6_ADDR_ANY is used as source) |
dest | the destination IPv6 address to send the packet to |
hl | the Hop Limit value to be set in the IPv6 header |
tc | the Traffic Class value to be set in the IPv6 header |
nexth | the Next Header to be set in the IPv6 header |
References ERR_RTE, IP6_ADDR_BLOCK1, IP6_ADDR_BLOCK2, IP6_ADDR_BLOCK3, IP6_ADDR_BLOCK4, IP6_ADDR_BLOCK5, IP6_ADDR_BLOCK6, IP6_ADDR_BLOCK7, IP6_ADDR_BLOCK8, ip6_addr_copy, ip6_output_if(), ip6_route(), IP6_STATS_INC, IP_HDRINCL, LWIP_DEBUGF, LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX, NULL, and pbuf::payload.
err_t ip6_output_if | ( | struct pbuf * | p, |
ip6_addr_t * | src, | ||
ip6_addr_t * | dest, | ||
u8_t | hl, | ||
u8_t | tc, | ||
u8_t | nexth, | ||
struct netif * | netif | ||
) |
Sends an IPv6 packet on a network interface.
This function constructs the IPv6 header. If the source IPv6 address is NULL, the IPv6 "ANY" address is used as source (usually during network startup). If the source IPv6 address it IP6_ADDR_ANY, the most appropriate IPv6 address of the outgoing network interface is filled in as source address. If the destination IPv6 address is IP_HDRINCL, p is assumed to already include an IPv6 header and p->payload points to it instead of the data.
p | the packet to send (p->payload points to the data, e.g. next protocol header; if dest == IP_HDRINCL, p already includes an IPv6 header and p->payload points to that IPv6 header) |
src | the source IPv6 address to send from (if src == IP6_ADDR_ANY, an IP address of the netif is selected and used as source address. if src == NULL, IP6_ADDR_ANY is used as source) |
dest | the destination IPv6 address to send the packet to |
hl | the Hop Limit value to be set in the IPv6 header |
tc | the Traffic Class value to be set in the IPv6 header |
nexth | the Next Header to be set in the IPv6 header |
netif | the netif on which to send this packet |
References ERR_RTE, ip6_addr_isany, ip6_output_if_src(), ip6_select_source_address(), IP6_STATS_INC, IP_HDRINCL, LWIP_DBG_LEVEL_SERIOUS, LWIP_DEBUGF, and NULL.
Referenced by icmp6_input(), icmp6_send_response(), ip6_output(), mld6_send(), nd6_send_na(), nd6_send_ns(), and nd6_send_rs().
err_t ip6_output_if_src | ( | struct pbuf * | p, |
ip6_addr_t * | src, | ||
ip6_addr_t * | dest, | ||
u8_t | hl, | ||
u8_t | tc, | ||
u8_t | nexth, | ||
struct netif * | netif | ||
) |
Same as ip6_output_if() but 'src' address is not replaced by netif address when it is 'any'.
References ERR_BUF, IP6_ADDR_ANY, ip6_addr_cmp, ip6_addr_copy, ip6_addr_isvalid, ip6_debug_print, IP6_HLEN, IP6_STATS_INC, IP6H_HOPLIM_SET, IP6H_NEXTH_SET, IP6H_PLEN_SET, IP6H_VTCFL_SET, IP_HDRINCL, pbuf::len, LWIP_ASSERT, LWIP_DBG_LEVEL_SERIOUS, LWIP_DEBUGF, LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX, netif::mtu, netif::name, nd6_get_destination_mtu(), netif_ip6_addr, netif_ip6_addr_state, NULL, netif::num, netif::output_ip6, pbuf::payload, pbuf_header(), pbuf::tot_len, and U16_F.
Referenced by ip6_output_if().
Finds the appropriate network interface for a given IPv6 address.
It tries to select a netif following a sequence of heuristics: 1) if there is only 1 netif, return it 2) if the destination is a link-local address, try to match the src address to a netif. this is a tricky case because with multiple netifs, link-local addresses only have meaning within a particular subnet/link. 3) tries to match the destination subnet to a configured address 4) tries to find a router 5) tries to match the source address to the netif 6) returns the default netif, if configured
src | the source IPv6 address, if known |
dest | the destination IPv6 address for which to find the route |
References default_router_list, ip6_addr_cmp, ip6_addr_isany, ip6_addr_islinklocal, ip6_addr_isvalid, ip6_addr_netcmp, nd6_select_router(), nd6_router_list_entry::neighbor_entry, nd6_neighbor_cache_entry::netif, netif_default, netif_ip6_addr, netif_ip6_addr_state, netif_list, netif::next, and NULL.
Referenced by icmp6_send_response(), and ip6_output().
ip6_addr_t* ip6_select_source_address | ( | struct netif * | netif, |
ip6_addr_t * | dest | ||
) |
Select the best IPv6 source address for a given destination IPv6 address.
Loosely follows RFC 3484. "Strong host" behavior is assumed.
netif | the netif on which to send a packet |
dest | the destination we are trying to reach |
References ip6_addr_isglobal, ip6_addr_islinklocal, ip6_addr_ismulticast_global, ip6_addr_ismulticast_iflocal, ip6_addr_ismulticast_linklocal, ip6_addr_ismulticast_orglocal, ip6_addr_ismulticast_sitelocal, ip6_addr_issitelocal, ip6_addr_isuniquelocal, ip6_addr_isvalid, ip6_addr_netcmp, netif_ip6_addr, netif_ip6_addr_state, and NULL.
Referenced by icmp6_input(), icmp6_send_response(), and ip6_output_if().