Contiki-NG
packetutils.c
1/*
2 * Copyright (c) 2011, Swedish Institute of Computer Science.
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
30#include "contiki.h"
31#include "net/packetbuf.h"
32#define DEBUG DEBUG_NONE
33#include "net/ipv6/uip-debug.h"
34
35/*---------------------------------------------------------------------------*/
36int
37packetutils_serialize_atts(uint8_t *data, int size)
38{
39 int i;
40 /* set the length first later */
41 int pos = 1;
42 int cnt = 0;
43 /* assume that values are 16-bit */
44 uint16_t val;
45 PRINTF("packetutils: serializing packet atts");
46 for(i = 0; i < PACKETBUF_NUM_ATTRS; i++) {
47 val = packetbuf_attr(i);
48 if(val != 0) {
49 if(pos + 3 > size) {
50 return -1;
51 }
52 data[pos++] = i;
53 data[pos++] = val >> 8;
54 data[pos++] = val & 255;
55 cnt++;
56 PRINTF(" %d=%d", i, val);
57 }
58 }
59 PRINTF(" (%d)\n", cnt);
60
61 data[0] = cnt;
62 return pos;
63}
64/*---------------------------------------------------------------------------*/
65int
66packetutils_deserialize_atts(const uint8_t *data, int size)
67{
68 int i, cnt, pos;
69
70 pos = 0;
71 cnt = data[pos++];
72 PRINTF("packetutils: deserializing %d packet atts:", cnt);
73 if(cnt > PACKETBUF_NUM_ATTRS) {
74 PRINTF(" *** too many: %u!\n", PACKETBUF_NUM_ATTRS);
75 return -1;
76 }
77 for(i = 0; i < cnt; i++) {
78 if(data[pos] >= PACKETBUF_NUM_ATTRS) {
79 /* illegal attribute identifier */
80 PRINTF(" *** unknown attribute %u\n", data[pos]);
81 return -1;
82 }
83 PRINTF(" %d=%d", data[pos], (data[pos + 1] << 8) | data[pos + 2]);
84 packetbuf_set_attr(data[pos], (data[pos + 1] << 8) | data[pos + 2]);
85 pos += 3;
86 }
87 PRINTF("\n");
88 return pos;
89}
90/*---------------------------------------------------------------------------*/
Header file for the Packet buffer (packetbuf) management.
A set of debugging macros for the IP stack.