Contiki-NG
routing.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017, RISE SICS.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the Institute nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * This file is part of the Contiki operating system.
30  *
31  */
32 /**
33  * \addtogroup net-layer
34  * @{
35  *
36  * \defgroup routing An API for routing
37  * @{
38 */
39 
40 /**
41  * \file
42  * Routing driver header file
43  * \author
44  * Simon Duquennoy <simon.duquennoy@ri.se>
45  */
46 
47 #ifndef ROUTING_H_
48 #define ROUTING_H_
49 
50 #include "contiki.h"
51 #include "net/ipv6/uip.h"
52 #include "net/ipv6/uip-ds6-nbr.h"
53 #include "net/ipv6/uip-ds6-route.h"
54 #include "net/ipv6/uip-sr.h"
55 #include "net/linkaddr.h"
56 
57 /**
58  * The structure of a routing protocol driver.
59  */
61  char *name;
62  /** Initialize the routing protocol */
63  void (* init)(void);
64  /**
65  * Set the prefix, for nodes that will operate as root
66  *
67  * \param prefix The prefix. If NULL, uip_ds6_default_prefix() is used instead
68  * \param iid The IID. If NULL, it will be built from uip_ds6_set_addr_iid.
69  */
70  void (* root_set_prefix)(uip_ipaddr_t *prefix, uip_ipaddr_t *iid);
71  /**
72  * Set the node as root and start a network
73  *
74  * \return 0 in case of success, -1 otherwise
75  */
76  int (* root_start)(void);
77  /**
78  * Tells whether the node is a network root or not
79  *
80  * \return 1 if we are root, 0 otherwise
81  */
82  int (* node_is_root)(void);
83  /**
84  * Returns the IPv6 address of the network root, if any
85  *
86  * \param ipaddr A pointer where to copy the IP address of the root
87  * \return 1 if the root address was copied, 0 otherwise
88  */
89  int (* get_root_ipaddr)(uip_ipaddr_t *ipaddr);
90  /**
91  * Returns the global IPv6 address of a source routing node
92  *
93  * \param ipaddr A pointer where to copy the IP address of the node
94  * \param node The source routing node
95  * \return 1 if the global node address was copied, 0 otherwise
96  */
97  int (* get_sr_node_ipaddr)(uip_ipaddr_t *addr, const uip_sr_node_t *node);
98  /**
99  * Leave the network the node is part of
100  *
101  */
102  void (* leave_network)(void);
103  /**
104  * Tells whether the node is currently part of a network
105  *
106  * \return 1 if we have joined a network, 0 otherwise.
107  */
108  int (* node_has_joined)(void);
109  /**
110  * Tells whether the node is currently reachable as part of the network
111  *
112  * \return 1 if we are reachable, 0 otherwise.
113  */
114  int (* node_is_reachable)(void);
115  /**
116  * Triggers a global topology repair
117  *
118  * \param str A textual description of the cause for triggering a repair
119  */
120  void (* global_repair)(const char *str);
121  /**
122  * Triggers a RPL local topology repair
123  *
124  * \param str A textual description of the cause for triggering a repair
125  */
126  void (* local_repair)(const char *str);
127  /**
128  * Removes all extension headers that pertain to the routing protocol.
129  *
130  * \return true in case of success, false otherwise
131  */
132  bool (* ext_header_remove)(void);
133  /**
134  * Adds/updates routing protocol extension headers to current uIP packet.
135  *
136  * \return 1 in case of success, 0 otherwise
137  */
138  int (* ext_header_update)(void);
139  /**
140  * Process and update the routing protocol hob-by-hop
141  * extention headers of the current uIP packet.
142  *
143  * \param ext_buf A pointer to the ext header buffer
144  * \param opt_offset The offset within the extension header where
145  * the option starts
146  * \return 1 in case the packet is valid and to be processed further,
147  * 0 in case the packet must be dropped.
148  */
149  int (* ext_header_hbh_update)(uint8_t *ext_buf, int opt_offset);
150  /**
151  * Process and update SRH in-place,
152  * i.e. internal address swapping as per RFC6554
153  * \return 1 if SRH found, 0 otherwise
154  */
155  int (* ext_header_srh_update)(void);
156  /**
157  * Look for next hop from SRH of current uIP packet.
158  *
159  * \param ipaddr A pointer to the address where to store the next hop.
160  * \return 1 if a next hop was found, 0 otherwise
161  */
162  int (* ext_header_srh_get_next_hop)(uip_ipaddr_t *ipaddr);
163  /**
164  * Called by lower layers after every packet transmission
165  *
166  * \param addr The link-layer addrress of the packet destination
167  * \param status The transmission status (see os/net/mac/mac.h)
168  * \param numtx The total number of transmission attempts
169  */
170  void (* link_callback)(const linkaddr_t *addr, int status, int numtx);
171  /**
172  * Called by uIP to notify addition/removal of IPv6 neighbor entries
173  *
174  * \param addr The link-layer addrress of the packet destination
175  * \param status The transmission status (see os/net/mac/mac.h)
176  * \param numtx The total number of transmission attempts
177  */
179  /**
180  * Called by uIP if it has decided to drop a route because
181  *
182  * \param route The route that will be dropped after this function returns
183  */
184  void (* drop_route)(uip_ds6_route_t *route);
185  /**
186  * Tells whether the protocol is in leaf mode
187  *
188  * \retval 1 if the protocol is in leaf mode, 0 if not.
189  */
190  uint8_t (* is_in_leaf_mode)(void);
191 };
192 
193 #endif /* ROUTING_H_ */
194 /**
195  * @}
196  * @}
197  */
static uip_ipaddr_t ipaddr
Pointer to prefix information option in uip_buf.
Definition: uip-nd6.c:116
int(* node_has_joined)(void)
Tells whether the node is currently part of a network.
Definition: routing.h:108
static uip_ds6_nbr_t * nbr
Pointer to llao option in uip_buf.
Definition: uip-nd6.c:106
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
Definition: uip-nd6.c:107
Header file for the link-layer address representation
void(* link_callback)(const linkaddr_t *addr, int status, int numtx)
Called by lower layers after every packet transmission.
Definition: routing.h:170
IPv6 Neighbor cache (link-layer/IPv6 address mapping)
void(* drop_route)(uip_ds6_route_t *route)
Called by uIP if it has decided to drop a route because.
Definition: routing.h:184
uint8_t(* is_in_leaf_mode)(void)
Tells whether the protocol is in leaf mode.
Definition: routing.h:190
int(* root_start)(void)
Set the node as root and start a network.
Definition: routing.h:76
void(* global_repair)(const char *str)
Triggers a global topology repair.
Definition: routing.h:120
Source routing support.
void(* root_set_prefix)(uip_ipaddr_t *prefix, uip_ipaddr_t *iid)
Set the prefix, for nodes that will operate as root.
Definition: routing.h:70
void(* init)(void)
Initialize the routing protocol.
Definition: routing.h:63
An entry in the routing table.
void(* neighbor_state_changed)(uip_ds6_nbr_t *nbr)
Called by uIP to notify addition/removal of IPv6 neighbor entries.
Definition: routing.h:178
int(* node_is_root)(void)
Tells whether the node is a network root or not.
Definition: routing.h:82
int(* ext_header_srh_get_next_hop)(uip_ipaddr_t *ipaddr)
Look for next hop from SRH of current uIP packet.
Definition: routing.h:162
void(* leave_network)(void)
Leave the network the node is part of.
Definition: routing.h:102
int(* ext_header_hbh_update)(uint8_t *ext_buf, int opt_offset)
Process and update the routing protocol hob-by-hop extention headers of the current uIP packet...
Definition: routing.h:149
Header file for the uIP TCP/IP stack.
int(* ext_header_srh_update)(void)
Process and update SRH in-place, i.e.
Definition: routing.h:155
Header file for routing table manipulation.
void(* local_repair)(const char *str)
Triggers a RPL local topology repair.
Definition: routing.h:126
int(* get_sr_node_ipaddr)(uip_ipaddr_t *addr, const uip_sr_node_t *node)
Returns the global IPv6 address of a source routing node.
Definition: routing.h:97
int(* get_root_ipaddr)(uip_ipaddr_t *ipaddr)
Returns the IPv6 address of the network root, if any.
Definition: routing.h:89
int(* ext_header_update)(void)
Adds/updates routing protocol extension headers to current uIP packet.
Definition: routing.h:138
bool(* ext_header_remove)(void)
Removes all extension headers that pertain to the routing protocol.
Definition: routing.h:132
The structure of a routing protocol driver.
Definition: routing.h:60
A node in a source routing graph, stored at the root and representing all child-parent relationship...
Definition: uip-sr.h:92
int(* node_is_reachable)(void)
Tells whether the node is currently reachable as part of the network.
Definition: routing.h:114
The default nbr_table entry (when UIP_DS6_NBR_MULTI_IPV6_ADDRS is disabled), that implements nbr cach...
Definition: uip-ds6-nbr.h:105