63 linkaddr_t originator;
66 #if CONTIKI_TARGET_NETSIM
74 #define PRINTF(...) printf(__VA_ARGS__)
80 static char rrep_pending;
83 send_rreq(
struct route_discovery_conn *c,
const linkaddr_t *dest)
86 struct route_msg *msg;
96 msg->rreq_id = c->rreq_id;
99 netflood_send(&c->rreqconn, c->rreq_id);
104 send_rrep(
struct route_discovery_conn *c,
const linkaddr_t *dest)
106 struct rrep_hdr *rrepmsg;
107 struct route_entry *rt;
108 linkaddr_t saved_dest;
119 rt = route_lookup(dest);
121 PRINTF(
"%d.%d: send_rrep to %d.%d via %d.%d\n",
123 dest->u8[0],dest->u8[1],
124 rt->nexthop.u8[0],rt->nexthop.u8[1]);
125 unicast_send(&c->rrepconn, &rt->nexthop);
127 PRINTF(
"%d.%d: no route for rrep to %d.%d\n",
129 dest->u8[0],dest->u8[1]);
134 insert_route(
const linkaddr_t *originator,
const linkaddr_t *last_hop,
137 PRINTF(
"%d.%d: Inserting %d.%d into routing table, next hop %d.%d, hop count %d\n",
139 originator->u8[0], originator->u8[1],
140 last_hop->u8[0], last_hop->u8[1],
143 route_add(originator, last_hop, hops, 0);
163 rrep_packet_received(
struct unicast_conn *uc,
const linkaddr_t *from)
166 struct route_entry *rt;
168 struct route_discovery_conn *c = (
struct route_discovery_conn *)
169 ((
char *)uc - offsetof(
struct route_discovery_conn, rrepconn));
171 PRINTF(
"%d.%d: rrep_packet_received from %d.%d towards %d.%d len %d\n",
173 from->u8[0],from->u8[1],
174 msg->dest.u8[0],msg->dest.u8[1],
177 PRINTF(
"from %d.%d hops %d rssi %d lqi %d\n",
178 from->u8[0], from->u8[1],
180 packetbuf_attr(PACKETBUF_ATTR_RSSI),
181 packetbuf_attr(PACKETBUF_ATTR_LINK_QUALITY));
183 insert_route(&msg->originator, from, msg->hops);
186 PRINTF(
"rrep for us!\n");
189 if(c->cb->new_route) {
190 linkaddr_t originator;
196 c->cb->new_route(c, &originator);
202 rt = route_lookup(&msg->dest);
204 PRINTF(
"forwarding to %d.%d\n", rt->nexthop.u8[0], rt->nexthop.u8[1]);
206 unicast_send(&c->rrepconn, &rt->nexthop);
214 rreq_packet_received(
struct netflood_conn *nf,
const linkaddr_t *from,
215 const linkaddr_t *originator, uint8_t seqno, uint8_t hops)
218 struct route_discovery_conn *c = (
struct route_discovery_conn *)
219 ((
char *)nf - offsetof(
struct route_discovery_conn, rreqconn));
221 PRINTF(
"%d.%d: rreq_packet_received from %d.%d hops %d rreq_id %d last %d.%d/%d\n",
223 from->u8[0], from->u8[1],
225 c->last_rreq_originator.u8[0],
226 c->last_rreq_originator.u8[1],
229 if(!(
linkaddr_cmp(&c->last_rreq_originator, originator) &&
230 c->last_rreq_id == msg->rreq_id)) {
232 PRINTF(
"%d.%d: rreq_packet_received: request for %d.%d originator %d.%d / %d\n",
234 msg->dest.u8[0], msg->dest.u8[1],
235 originator->u8[0], originator->u8[1],
239 c->last_rreq_id = msg->rreq_id;
242 PRINTF(
"%d.%d: route_packet_received: route request for our address\n",
244 PRINTF(
"from %d.%d hops %d rssi %d lqi %d\n",
245 from->u8[0], from->u8[1],
247 packetbuf_attr(PACKETBUF_ATTR_RSSI),
248 packetbuf_attr(PACKETBUF_ATTR_LINK_QUALITY));
250 insert_route(originator, from, hops);
253 send_rrep(c, originator);
257 PRINTF(
"from %d.%d hops %d rssi %d lqi %d\n",
258 from->u8[0], from->u8[1],
260 packetbuf_attr(PACKETBUF_ATTR_RSSI),
261 packetbuf_attr(PACKETBUF_ATTR_LINK_QUALITY));
262 insert_route(originator, from, hops);
270 static const struct unicast_callbacks rrep_callbacks = {rrep_packet_received};
271 static const struct netflood_callbacks rreq_callbacks = {rreq_packet_received,
NULL, NULL};
274 route_discovery_open(
struct route_discovery_conn *c,
277 const struct route_discovery_callbacks *callbacks)
279 netflood_open(&c->rreqconn, time, channels + 0, &rreq_callbacks);
280 unicast_open(&c->rrepconn, channels + 1, &rrep_callbacks);
285 route_discovery_close(
struct route_discovery_conn *c)
287 unicast_close(&c->rrepconn);
288 netflood_close(&c->rreqconn);
293 timeout_handler(
void *ptr)
295 struct route_discovery_conn *c = ptr;
296 PRINTF(
"route_discovery: timeout, timed out\n");
298 if(c->cb->timedout) {
304 route_discovery_discover(
struct route_discovery_conn *c,
const linkaddr_t *addr,
305 clock_time_t timeout)
308 PRINTF(
"route_discovery_send: ignoring request because of pending response\n");
312 PRINTF(
"route_discovery_send: sending route request\n");
313 ctimer_set(&c->t, timeout, timeout_handler, c);
linkaddr_t linkaddr_node_addr
The Rime address of the node.
#define NULL
The null pointer.
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
Header file for the Rime stack
uint16_t packetbuf_datalen(void)
Get the length of the data in the packetbuf.
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src)
Copy a Rime address.
void ctimer_set(struct ctimer *c, clock_time_t t, void(*f)(void *), void *ptr)
Set a callback timer.
Header file for the Rime mesh routing protocol
void packetbuf_clear(void)
Clear and reset the packetbuf.
int linkaddr_cmp(const linkaddr_t *addr1, const linkaddr_t *addr2)
Compare two Rime addresses.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
void ctimer_stop(struct ctimer *c)
Stop a pending callback timer.
Header file for the Rime route table