50 #ifdef CHAMELEON_CONF_WITH_MAC_LINK_ADDRESSES
51 #define CHAMELEON_WITH_MAC_LINK_ADDRESSES CHAMELEON_CONF_WITH_MAC_LINK_ADDRESSES
53 #define CHAMELEON_WITH_MAC_LINK_ADDRESSES 0
60 static const uint8_t bitmask[9] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0,
61 0xf8, 0xfc, 0xfe, 0xff };
66 #define PRINTF(...) printf(__VA_ARGS__)
73 get_bits_in_byte(uint8_t *from,
int bitpos,
int vallen)
77 shifted_val = (from[0] << 8) | from[1];
85 return (((shifted_val << bitpos) >> 8) & bitmask[vallen]) >> (8 - vallen);
89 get_bits(uint8_t *to, uint8_t *from,
int bitpos,
int vallen)
95 *to = get_bits_in_byte(from, bitpos, vallen);
98 for(i = 0; i < vallen / 8; ++i) {
105 to[i] = get_bits_in_byte(&from[i], 0, bits);
108 for(i = 0; i < vallen / 8; ++i) {
111 to[i] = get_bits_in_byte(&from[i], bitpos, 8);
115 to[i] = get_bits_in_byte(&from[i], bitpos, bits);
122 header_size(
const struct packetbuf_attrlist *a)
130 for(; a->type != PACKETBUF_ATTR_NONE; ++a) {
131 #if CHAMELEON_WITH_MAC_LINK_ADDRESSES
132 if(a->type == PACKETBUF_ADDR_SENDER ||
133 a->type == PACKETBUF_ADDR_RECEIVER) {
150 set_bits_in_byte(uint8_t *target,
int bitpos, uint8_t val,
int vallen)
152 unsigned short shifted_val;
153 shifted_val = val << (8 - bitpos + 8 - vallen);
156 target[0] |= shifted_val >> 8;
157 target[1] |= shifted_val & 0xff;
161 set_bits(uint8_t *ptr,
int bitpos, uint8_t *val,
int vallen)
169 set_bits_in_byte(ptr, bitpos, *val , vallen);
172 for(i = 0; i < vallen / 8; ++i) {
179 set_bits_in_byte(&ptr[i], 0, val[i] >> (8 - bits), bits);
182 for(i = 0; i < vallen / 8; ++i) {
185 set_bits_in_byte(&ptr[i], bitpos, val[i], 8);
189 set_bits_in_byte(&ptr[i], 0, val[i] >> (8 - bits + bitpos), bits);
197 printbin(
int n,
int digits)
202 for(i = 0; i < digits; ++i) {
203 output[digits - i - 1] = (n & 1) +
'0';
212 printhdr(uint8_t *hdr,
int len)
217 for(i = 0; i < len; ++i) {
234 pack_header(
struct channel *c)
236 const struct packetbuf_attrlist *a;
238 int byteptr, bitptr, len;
240 struct bitopt_hdr *hdr;
245 hdrbytesize = c->hdrsize / 8 + ((c->hdrsize & 7) == 0? 0: 1);
247 PRINTF(
"chameleon-bitopt: insufficient space for headers\n");
251 hdr->channel[0] = c->channelno & 0xff;
252 hdr->channel[1] = (c->channelno >> 8) & 0xff;
255 memset(hdrptr, 0, hdrbytesize);
257 byteptr = bitptr = 0;
259 for(a = c->attrlist; a->type != PACKETBUF_ATTR_NONE; ++a) {
260 #if CHAMELEON_WITH_MAC_LINK_ADDRESSES
261 if(a->type == PACKETBUF_ADDR_SENDER ||
262 a->type == PACKETBUF_ADDR_RECEIVER) {
264 PRINTF(
"%d.%d: pack_header leaving sender/receiver to link layer\n");
268 PRINTF(
"%d.%d: pack_header type %d, len %d, bitptr %d, ",
270 a->type, a->len, bitptr);
273 byteptr = bitptr / 8;
274 if(PACKETBUF_IS_ADDR(a->type)) {
275 set_bits(&hdrptr[byteptr], bitptr & 7,
276 (uint8_t *)packetbuf_addr(a->type), len);
277 PRINTF(
"address %d.%d\n",
279 ((uint8_t *)packetbuf_addr(a->type))[0],
280 ((uint8_t *)packetbuf_addr(a->type))[1]);
282 packetbuf_attr_t val;
283 val = packetbuf_attr(a->type);
284 set_bits(&hdrptr[byteptr], bitptr & 7,
285 (uint8_t *)&val, len);
298 static struct channel *
301 const struct packetbuf_attrlist *a;
302 int byteptr, bitptr, len;
305 struct bitopt_hdr *hdr;
313 PRINTF(
"chameleon-bitopt: too short packet\n");
316 c = channel_lookup((hdr->channel[1] << 8) + hdr->channel[0]);
318 PRINTF(
"chameleon-bitopt: input: channel %u not found\n",
319 (hdr->channel[1] << 8) + hdr->channel[0]);
324 hdrbytesize = c->hdrsize / 8 + ((c->hdrsize & 7) == 0? 0: 1);
326 PRINTF(
"chameleon-bitopt: too short packet\n");
329 byteptr = bitptr = 0;
330 for(a = c->attrlist; a->type != PACKETBUF_ATTR_NONE; ++a) {
331 #if CHAMELEON_WITH_MAC_LINK_ADDRESSES
332 if(a->type == PACKETBUF_ADDR_SENDER ||
333 a->type == PACKETBUF_ADDR_RECEIVER) {
338 PRINTF(
"%d.%d: unpack_header type %d, len %d, bitptr %d\n",
340 a->type, a->len, bitptr);
343 byteptr = bitptr / 8;
344 if(PACKETBUF_IS_ADDR(a->type)) {
346 get_bits((uint8_t *)&addr, &hdrptr[byteptr], bitptr & 7, len);
347 PRINTF(
"%d.%d: unpack_header type %d, addr %d.%d\n",
349 a->type, addr.u8[0], addr.u8[1]);
350 packetbuf_set_addr(a->type, &addr);
352 packetbuf_attr_t val = 0;
353 get_bits((uint8_t *)&val, &hdrptr[byteptr], bitptr & 7, len);
355 packetbuf_set_attr(a->type, val);
356 PRINTF(
"%d.%d: unpack_header type %d, val %d\n",
int packetbuf_hdralloc(int size)
Extend the header of the packetbuf, for outbound packets.
linkaddr_t linkaddr_node_addr
The Rime address of the node.
Header file for Chameleon, Rime's header processing module
#define CC_CONST_FUNCTION
Configure if the C compiler have problems with const function pointers.
#define NULL
The null pointer.
Header file for the Rime stack
void * packetbuf_hdrptr(void)
Get a pointer to the header in the packetbuf, for outbound packets.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
int packetbuf_hdrreduce(int size)
Reduce the header in the packetbuf, for incoming packets.