Blame view

RIOT/sys/include/net/gnrc/netif/hdr.h 7.5 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
  /*
   * Copyright (C) 2015 Freie Universitรคt Berlin
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @defgroup    net_gnrc_netif_hdr Generic network interface header
   * @ingroup     net_gnrc_netif
   * @{
   *
   * @file
   * @brief       Generic network interface header
   *
   * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
   * @author      Martine Lenders <mlenders@inf.fu-berlin.de>
   */
  
  #ifndef NET_GNRC_NETIF_HDR_H
  #define NET_GNRC_NETIF_HDR_H
  
  #include <string.h>
  #include <stdint.h>
  
  #include "net/gnrc/pkt.h"
  #include "net/gnrc/pktbuf.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /**
   * @brief   Maximum length of the l2 addresses of the generic interface header
   *          in bytes.
   */
  #define GNRC_NETIF_HDR_L2ADDR_MAX_LEN   (8)
  
  /**
   * @brief   Maximum length of the string representatiom of l2 addresses of the
   *          generic interface header in bytes.
   */
  #define GNRC_NETIF_HDR_L2ADDR_PRINT_LEN (GNRC_NETIF_HDR_L2ADDR_MAX_LEN * 3)
  
  /**
   * @{
   * @name    Flags for the gnrc_netif_hdr_t
   */
  /**
   * @brief   Send packet broadcast.
   *
   * @details Packets with this flag set must be send broadcast.
   *          gnrc_netif_hdr_t::dst_l2addr_len and any appended destination
   *          address must be ignored.
   *          If the link layer does not support broadcast the packet must be
   *          dropped silently.
   */
  #define GNRC_NETIF_HDR_FLAGS_BROADCAST  (0x80)
  
  /**
   * @brief   Send packet multicast.
   *
   * @details Packets with this flag set must be send multicast.
   *          gnrc_netif_hdr_t::dst_l2addr_len and any appended destination
   *          address must be ignored.
   *          The context for the multicast address must be derived from the
   *          network layer destination address.
   *          If the link layer does not support multicast it should interpret
   *          this flag the same way it does @ref GNRC_NETIF_HDR_FLAGS_BROADCAST.
   */
  #define GNRC_NETIF_HDR_FLAGS_MULTICAST  (0x40)
  /**
   * @}
   */
  
  /**
   * @brief   Generic network interface header
   *
   * The link layer addresses included in this header are put in memory directly
   * following this struct.
   */
  typedef struct {
      uint8_t src_l2addr_len;     /**< length of l2 source address in byte */
      uint8_t dst_l2addr_len;     /**< length of l2 destination address in byte */
      kernel_pid_t if_pid;        /**< PID of network interface */
      uint8_t flags;              /**< flags as defined above */
      uint8_t rssi;               /**< rssi of received packet (optional) */
      uint8_t lqi;                /**< lqi of received packet (optional) */
  } gnrc_netif_hdr_t;
  
  /**
   * @brief   Initialize the given generic network interface header
   *
   * @param[in] hdr               header to initialize
   * @param[in] src_l2addr_len    link layer source address length
   * @param[in] dst_l2addr_len    link layer destination address length
   */
  static inline void gnrc_netif_hdr_init(gnrc_netif_hdr_t *hdr, uint8_t src_l2addr_len,
                                         uint8_t dst_l2addr_len)
  {
      hdr->src_l2addr_len = src_l2addr_len;
      hdr->dst_l2addr_len = dst_l2addr_len;
      hdr->if_pid = KERNEL_PID_UNDEF;
      hdr->rssi = 0;
      hdr->lqi = 0;
      hdr->flags = 0;
  }
  
  /**
   * @brief   Get the size of the given generic network interface header
   *
   * @param[in] hdr           header to get the size of
   *
   * @return                  the size of the given header, including link layer
   *                          addresses
   */
  static inline size_t gnrc_netif_hdr_sizeof(gnrc_netif_hdr_t *hdr)
  {
      return sizeof(gnrc_netif_hdr_t) + hdr->src_l2addr_len + hdr->dst_l2addr_len;
  }
  
  /**
   * @brief   Get the source address from the given header
   *
   * @param[in] hdr           header to read from
   *
   * @return                  pointer to source address on success
   * @return                  NULL on error
   */
  static inline uint8_t *gnrc_netif_hdr_get_src_addr(gnrc_netif_hdr_t *hdr)
  {
      return ((uint8_t *)(hdr + 1));
  }
  
  /**
   * @brief   Set the source address in the given header
   *
   * @param[in] hdr           header to write to
   * @param[in] addr          new source address
   * @param[in] addr_len      *addr* length
   */
  static inline void gnrc_netif_hdr_set_src_addr(gnrc_netif_hdr_t *hdr, uint8_t *addr,
          uint8_t addr_len)
  {
      if (addr_len != hdr->src_l2addr_len) {
          return;
      }
  
      memcpy(((uint8_t *)(hdr + 1)), addr, addr_len);
  }
  
  
  /**
   * @brief   Get the destination address from the given header
   *
   * @param[in] hdr           header to read from
   *
   * @return                  pointer to destination address on success
   * @return                  NULL on error
   */
  static inline uint8_t *gnrc_netif_hdr_get_dst_addr(gnrc_netif_hdr_t *hdr)
  {
      return (((uint8_t *)(hdr + 1)) + hdr->src_l2addr_len);
  }
  
  /**
   * @brief   Set the destination address in the given header
   *
   * @param[in] hdr           header to write to
   * @param[in] addr          new destination address
   * @param[in] addr_len      *addr* length
   */
  static inline void gnrc_netif_hdr_set_dst_addr(gnrc_netif_hdr_t *hdr, uint8_t *addr,
          uint8_t addr_len)
  {
      if (addr_len != hdr->dst_l2addr_len) {
          return;
      }
  
      memcpy(((uint8_t *)(hdr + 1)) + hdr->src_l2addr_len, addr, addr_len);
  }
  
  /**
   * @brief   Builds a generic network interface header for sending and
   *          adds it to the packet buffer.
   *
   * @param[in] src       Source address for the header. Can be NULL if not
   *                      known or required.
   * @param[in] src_len   Length of @p src. Can be 0 if not known or required.
   * @param[in] dst       Destination address for the header. Can be NULL if not
   *                      known or required.
   * @param[in] dst_len   Length of @p dst. Can be 0 if not known or required.
   *
   * @return  The generic network layer header on success.
   * @return  NULL on error.
   */
  gnrc_pktsnip_t *gnrc_netif_hdr_build(uint8_t *src, uint8_t src_len, uint8_t *dst, uint8_t dst_len);
  
  /**
   * @brief   Outputs a generic interface header to stdout.
   *
   * @param[in] hdr   A generic interface header.
   */
  void gnrc_netif_hdr_print(gnrc_netif_hdr_t *hdr);
  
  /**
   * @brief   Fetch the netif header flags of a gnrc packet
   *
   * @param[in]   pkt     gnrc packet from whom to fetch
   *
   * @return              netif header flags of @p pkt
   * @return              0, if no header is present
   */
  uint8_t gnrc_netif_hdr_get_flag(gnrc_pktsnip_t* pkt);
  
  /**
   * @brief   Extract the destination address out of a gnrc packet
   *
   * @param[in]   pkt                 gnrc packet from whom to extract
   * @param[out]  pointer_to_addr     pointer to address will be stored here
   *
   * @return                          length of destination address
   * @return                          -ENOENT, if no netif header is presented in @p pkt or if no
   *                                           destination address field presented in netif header.
   */
  int gnrc_netif_hdr_get_dstaddr(gnrc_pktsnip_t* pkt, uint8_t** pointer_to_addr);
  
  /**
   * @brief   Extract the source address out of a gnrc packet
   *
   * @param[in]   pkt                 gnrc packet from whom to extract
   * @param[out]  pointer_to_addr     pointer to address will be stored here
   *
   * @return                          length of source address
   * @return                          -ENOENT, if no netif header is presented in @p pkt or if no
   *                                           source address field presented in netif header.
   */
  int gnrc_netif_hdr_get_srcaddr(gnrc_pktsnip_t* pkt, uint8_t** pointer_to_addr);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* NET_GNRC_NETIF_HDR_H */
  /** @} */