Contiki-NG
nullnet.c
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 /**
34  * \file
35  * NullNet, a minimal network layer.
36  * \author
37  * Simon Duquennoy <simon.duquennoy@ri.se>
38  *
39  */
40 
41 /**
42  * \addtogroup nullnet
43  * @{
44  */
45 
46 #include "contiki.h"
47 #include "net/packetbuf.h"
48 #include "net/netstack.h"
49 #include "net/nullnet/nullnet.h"
50 
51 /* Log configuration */
52 #include "sys/log.h"
53 #define LOG_MODULE "NullNet"
54 #define LOG_LEVEL LOG_LEVEL_NULLNET
55 
56 uint8_t *nullnet_buf;
57 uint16_t nullnet_len;
58 static nullnet_input_callback current_callback = NULL;
59 /*--------------------------------------------------------------------*/
60 static void
61 init(void)
62 {
63  LOG_INFO("init\n");
64  current_callback = NULL;
65 }
66 /*--------------------------------------------------------------------*/
67 static void
68 input(void)
69 {
70  if(current_callback != NULL) {
71  LOG_INFO("received %u bytes from ", packetbuf_datalen());
72  LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER));
73  LOG_INFO_("\n");
74  current_callback(packetbuf_dataptr(), packetbuf_datalen(),
75  packetbuf_addr(PACKETBUF_ADDR_SENDER), packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
76  }
77 }
78 /*--------------------------------------------------------------------*/
79 void
81 {
82  current_callback = callback;
83 }
84 /*--------------------------------------------------------------------*/
85 static uint8_t
86 output(const linkaddr_t *dest)
87 {
89  packetbuf_copyfrom(nullnet_buf, nullnet_len);
90  if(dest != NULL) {
91  packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, dest);
92  } else {
93  packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &linkaddr_null);
94  }
95  packetbuf_set_addr(PACKETBUF_ADDR_SENDER, &linkaddr_node_addr);
96  LOG_INFO("sending %u bytes to ", packetbuf_datalen());
97  LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
98  LOG_INFO_("\n");
99  NETSTACK_MAC.send(NULL, NULL);
100  return 1;
101 }
102 /*--------------------------------------------------------------------*/
103 const struct network_driver nullnet_driver = {
104  "nullnet",
105  init,
106  input,
107  output
108 };
109 /*--------------------------------------------------------------------*/
110 /** @} */
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
Definition: packetbuf.c:143
void packetbuf_clear(void)
Clear and reset the packetbuf.
Definition: packetbuf.c:75
NullNet, a minimal network layer.
const linkaddr_t linkaddr_null
The null link-layer address.
static uint8_t output(const linkaddr_t *localdest)
Take an IP packet and format it to be sent on an 802.15.4 network using 6lowpan.
Definition: sicslowpan.c:1576
uint16_t packetbuf_datalen(void)
Get the length of the data in the packetbuf.
Definition: packetbuf.c:155
linkaddr_t linkaddr_node_addr
The link-layer address of the node.
Definition: linkaddr.c:48
uint8_t * nullnet_buf
Buffer used by the output function.
Definition: nullnet.c:56
void(* nullnet_input_callback)(const void *data, uint16_t len, const linkaddr_t *src, const linkaddr_t *dest)
Function prototype for NullNet input callback.
Definition: nullnet.h:64
The structure of a network driver in Contiki.
Definition: netstack.h:117
int packetbuf_copyfrom(const void *from, uint16_t len)
Copy from external data into the packetbuf.
Definition: packetbuf.c:84
void(* init)(void)
Initialize the network driver.
Definition: netstack.h:121
void(* send)(mac_callback_t sent_callback, void *ptr)
Send a packet from the packetbuf.
Definition: mac.h:69
void nullnet_set_input_callback(nullnet_input_callback callback)
Set input callback for NullNet.
Definition: nullnet.c:80
Header file for the Packet buffer (packetbuf) management
Include file for the Contiki low-layer network stack (NETSTACK)
Header file for the logging system
static void input(void)
Process a received 6lowpan packet.
Definition: sicslowpan.c:1813