libschc
schc.h
Go to the documentation of this file.
1 #ifndef COMPRESSOR_CONFIG_H_
2 #define COMPRESSOR_CONFIG_H_
3 
4 #include "schc_config.h"
5 
6 // protocol definitions
7 #define UDP_HLEN 8
8 #define IP6_HLEN 40
9 
10 // fixed fragmentation definitions
11 #define WINDOW_SIZE_BITS 1
12 #define MIC_C_SIZE_BITS 1
13 
14 #if !(RULE_SIZE_BITS % 8)
15 #define RULE_SIZE_BYTES (RULE_SIZE_BITS / 8)
16 #else
17 #define RULE_SIZE_BYTES (RULE_SIZE_BITS / 8) + 1
18 #endif
19 
20 #if !(((RULE_SIZE_BITS + DTAG_SIZE_BITS) / 8) % 8)
21 #define DTAG_SIZE_BYTES ((RULE_SIZE_BITS + DTAG_SIZE_BITS) / 8)
22 #else
23 #define DTAG_SIZE_BYTES ((RULE_SIZE_BITS + DTAG_SIZE_BITS) / 8) + 1
24 #endif
25 
26 #if !(((RULE_SIZE_BITS + DTAG_SIZE_BITS + WINDOW_SIZE_BITS) / 8) % 8)
27 #define WINDOW_SIZE_BYTES 1
28 #else
29 #define WINDOW_SIZE_BYTES ((RULE_SIZE_BITS + DTAG_SIZE_BITS + WINDOW_SIZE_BITS) / 8) + 1
30 #endif
31 
32 typedef struct schc_bitarray_t {
33  uint8_t* ptr;
34  uint32_t offset; // in bits
36 
37 typedef enum {
38  UP = 0, DOWN = 1, BI = 2
39 } direction;
40 
41 typedef enum {
42  NOTSENT = 0,
43  VALUESENT = 1,
45  LSB = 3,
47  COMPCHK = 5,
48  DEVIID = 6,
49  APPIID = 7
50 } CDA;
51 
52 typedef enum {
53  SCHC_IPV6 = 0,
54  SCHC_UDP = 1,
56 } schc_layer_t;
57 
58 typedef enum {
61 
62 struct schc_field {
63  char field[32];
64  uint8_t MO_param_length; // indicate number of bits for MSB and LSB or list length for MATCH-MAP
65  uint8_t field_length; // in bits
66  uint8_t field_pos;
69  uint8_t (*MO)(struct schc_field* target_field, unsigned char* field_value, uint16_t field_offset);
71 };
72 
73 // specific protocol layer structure
74 #if USE_IPv6
76  uint16_t rule_id;
77  uint8_t up;
78  uint8_t down;
79  uint8_t length;
81 };
82 #endif
83 
84 #if USE_UDP
86  uint16_t rule_id;
87  uint8_t up;
88  uint8_t down;
89  uint8_t length;
91 };
92 #endif
93 
94 #if USE_COAP
95 struct schc_coap_rule_t {
96  uint16_t rule_id;
97  uint8_t up;
98  uint8_t down;
99  uint8_t length;
100  struct schc_field content[COAP_FIELDS];
101 };
102 #endif
103 
104 // structure to allow generic compression of each layer
106  uint16_t rule_id;
107  uint8_t up;
108  uint8_t down;
109  uint8_t length;
110  struct schc_field content[];
111 };
112 
114 #if USE_IPv6
115  /* a pointer to the IPv6 rule */
117 #endif
118 #if USE_UDP
119  /* a pointer to the UDP rule */
120  const struct schc_udp_rule_t* udp_rule;
121 #endif
122 #if USE_COAP
123  /* a pointer to the CoAP rule */
124  const struct schc_coap_rule_t* coap_rule;
125 #endif
126 };
127 
128 struct schc_rule_t {
129  /* the rule id */
130  uint8_t id[RULE_SIZE_BYTES];
131  /* a pointer to the SCHC rule */
133  /* the reliability mode */
135  /* the fcn size in bits */
136  uint8_t FCN_SIZE;
137  /* the maximum number of fragments per window */
138  uint8_t MAX_WND_FCN;
139  /* the window size in bits */
140  uint8_t WINDOW_SIZE;
141  /* the dtag size in bits */
142  uint8_t DTAG_SIZE;
143 };
144 
145 struct schc_device {
146  /* the device id (e.g. EUI) */
147  uint32_t device_id;
148  /* the total number of rules for a device */
149  uint8_t rule_count;
150  /* a pointer to the collection of rules for a device */
151  const struct schc_rule_t *(*context)[];
152 };
153 
154 typedef uint8_t schc_ip6addr_t[16];
156 
158  /* IPv6 header. */
159  uint8_t vtc,
161  uint16_t flow;
162  uint8_t len[2];
163  uint8_t proto, ttl;
165 
166  /* UDP header. */
167  uint16_t srcport,
169  uint16_t udplen;
170  uint16_t udpchksum;
171 };
172 
173 static uint8_t equal(struct schc_field* target_field, unsigned char* field_value, uint16_t field_offset);
174 static uint8_t ignore(struct schc_field* target_field, unsigned char* field_value, uint16_t field_offset);
175 static uint8_t MSB(struct schc_field* target_field, unsigned char* field_value, uint16_t field_offset);
176 static uint8_t matchmap(struct schc_field* target_field, unsigned char* field_value, uint16_t field_offset);
177 
178 #endif
NOTSENT
Definition: schc.h:42
schc_layer_t
schc_layer_t
Definition: schc.h:52
SCHC_COAP
Definition: schc.h:55
schc_bitarray_t
Definition: schc.h:32
schc_udpip_hdr::srcport
uint16_t srcport
Definition: schc.h:167
MAX_FIELD_LENGTH
#define MAX_FIELD_LENGTH
Definition: schc_config.h:24
schc_udpip_hdr::udplen
uint16_t udplen
Definition: schc.h:169
schc_layer_rule_t
Definition: schc.h:105
schc_rule_t::MAX_WND_FCN
uint8_t MAX_WND_FCN
Definition: schc.h:138
schc_udpip_hdr::destport
uint16_t destport
Definition: schc.h:168
CDA
CDA
Definition: schc.h:41
UDP_FIELDS
#define UDP_FIELDS
Definition: schc_config.h:28
schc_udpip_hdr::destipaddr
schc_ip6addr_t destipaddr
Definition: schc.h:164
schc_layer_rule_t::length
uint8_t length
Definition: schc.h:109
DEVIID
Definition: schc.h:48
schc_field::field_length
uint8_t field_length
Definition: schc.h:65
schc_rule_t::DTAG_SIZE
uint8_t DTAG_SIZE
Definition: schc.h:142
reliability_mode
reliability_mode
Definition: schc.h:58
schc_udp_rule_t::content
struct schc_field content[UDP_FIELDS]
Definition: schc.h:90
schc_layer_rule_t::rule_id
uint16_t rule_id
Definition: schc.h:106
schc_field::MO_param_length
uint8_t MO_param_length
Definition: schc.h:64
schc_bitarray_t
struct schc_bitarray_t schc_bitarray_t
schc_device
Definition: schc.h:145
equal
static uint8_t equal(struct schc_field *target_field, unsigned char *field_value, uint16_t field_offset)
schc_rule_t
Definition: schc.h:128
NOT_FRAGMENTED
Definition: schc.h:59
schc_udpip_hdr::flow
uint16_t flow
Definition: schc.h:161
IPV6_FIELDS
#define IPV6_FIELDS
Definition: schc_config.h:27
schc_rule_t::compression_rule
const struct schc_compression_rule_t * compression_rule
Definition: schc.h:132
schc_layer_rule_t::down
uint8_t down
Definition: schc.h:108
schc_compression_rule_t::udp_rule
const struct schc_udp_rule_t * udp_rule
Definition: schc.h:120
schc_field::field
char field[32]
Definition: schc.h:63
BI
Definition: schc.h:38
direction
direction
Definition: schc.h:37
schc_ipv6_rule_t
Definition: schc.h:75
schc_compression_rule_t
Definition: schc.h:113
COMPCHK
Definition: schc.h:47
schc_config.h
schc_udp_rule_t::length
uint8_t length
Definition: schc.h:89
schc_ip6addr_t
uint8_t schc_ip6addr_t[16]
Definition: schc.h:154
schc_rule_t::WINDOW_SIZE
uint8_t WINDOW_SIZE
Definition: schc.h:140
schc_rule_t::FCN_SIZE
uint8_t FCN_SIZE
Definition: schc.h:136
schc_field::field_pos
uint8_t field_pos
Definition: schc.h:66
schc_udp_rule_t::rule_id
uint16_t rule_id
Definition: schc.h:86
APPIID
Definition: schc.h:49
schc_ipaddr_t
schc_ip6addr_t schc_ipaddr_t
Definition: schc.h:155
schc_bitarray_t::offset
uint32_t offset
Definition: schc.h:34
schc_udpip_hdr::ttl
uint8_t ttl
Definition: schc.h:163
SCHC_IPV6
Definition: schc.h:53
SCHC_UDP
Definition: schc.h:54
schc_field::MO
uint8_t(* MO)(struct schc_field *target_field, unsigned char *field_value, uint16_t field_offset)
Definition: schc.h:69
schc_device::device_id
uint32_t device_id
Definition: schc.h:147
MSB
static uint8_t MSB(struct schc_field *target_field, unsigned char *field_value, uint16_t field_offset)
COMPLENGTH
Definition: schc.h:46
MAPPINGSENT
Definition: schc.h:44
schc_ipv6_rule_t::length
uint8_t length
Definition: schc.h:79
schc_udp_rule_t::up
uint8_t up
Definition: schc.h:87
ignore
static uint8_t ignore(struct schc_field *target_field, unsigned char *field_value, uint16_t field_offset)
LSB
Definition: schc.h:45
NO_ACK
Definition: schc.h:59
COAP_FIELDS
#define COAP_FIELDS
Definition: schc_config.h:29
UP
Definition: schc.h:38
schc_udpip_hdr::tcf
uint8_t tcf
Definition: schc.h:160
schc_ipv6_rule_t::down
uint8_t down
Definition: schc.h:78
VALUESENT
Definition: schc.h:43
schc_udpip_hdr::len
uint8_t len[2]
Definition: schc.h:162
schc_ipv6_rule_t::up
uint8_t up
Definition: schc.h:77
schc_field::target_value
unsigned char target_value[MAX_FIELD_LENGTH]
Definition: schc.h:68
schc_rule_t::mode
reliability_mode mode
Definition: schc.h:134
ACK_ALWAYS
Definition: schc.h:59
schc_udp_rule_t::down
uint8_t down
Definition: schc.h:88
schc_udp_rule_t
Definition: schc.h:85
ACK_ON_ERROR
Definition: schc.h:59
schc_ipv6_rule_t::rule_id
uint16_t rule_id
Definition: schc.h:76
DOWN
Definition: schc.h:38
schc_layer_rule_t::up
uint8_t up
Definition: schc.h:107
schc_udpip_hdr::proto
uint8_t proto
Definition: schc.h:163
schc_udpip_hdr::vtc
uint8_t vtc
Definition: schc.h:159
matchmap
static uint8_t matchmap(struct schc_field *target_field, unsigned char *field_value, uint16_t field_offset)
schc_field::action
CDA action
Definition: schc.h:70
schc_compression_rule_t::ipv6_rule
const struct schc_ipv6_rule_t * ipv6_rule
Definition: schc.h:116
RULE_SIZE_BYTES
#define RULE_SIZE_BYTES
Definition: schc.h:15
schc_udpip_hdr::srcipaddr
schc_ip6addr_t srcipaddr
Definition: schc.h:164
schc_udpip_hdr::udpchksum
uint16_t udpchksum
Definition: schc.h:170
schc_layer_rule_t::content
struct schc_field content[]
Definition: schc.h:110
schc_field::dir
direction dir
Definition: schc.h:67
schc_field
Definition: schc.h:62
schc_device::rule_count
uint8_t rule_count
Definition: schc.h:149
schc_ipv6_rule_t::content
struct schc_field content[IPV6_FIELDS]
Definition: schc.h:80
schc_udpip_hdr
Definition: schc.h:157
schc_bitarray_t::ptr
uint8_t * ptr
Definition: schc.h:33