chameleon.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "net/rime/chameleon.h"
00042 #include "net/rime/channel.h"
00043 #include "net/rime.h"
00044 #include "lib/list.h"
00045
00046 #include <stdio.h>
00047
00048 #ifndef CHAMELEON_MODULE
00049 #ifdef CHAMELEON_CONF_MODULE
00050 #define CHAMELEON_MODULE CHAMELEON_CONF_MODULE
00051 #else
00052 #define CHAMELEON_MODULE chameleon_bitopt
00053 #endif
00054 #endif
00055
00056 extern const struct chameleon_module CHAMELEON_MODULE;
00057
00058 #define DEBUG 0
00059 #if DEBUG
00060 #include <stdio.h>
00061 #define PRINTF(...) printf(__VA_ARGS__)
00062 #else
00063 #define PRINTF(...)
00064 #endif
00065
00066
00067 void
00068 chameleon_init(void)
00069 {
00070 channel_init();
00071 }
00072
00073 #if DEBUG
00074 static void
00075 printbin(int n, int digits)
00076 {
00077 int i;
00078 char output[128];
00079
00080 for(i = 0; i < digits; ++i) {
00081 output[digits - i - 1] = (n & 1) + '0';
00082 n >>= 1;
00083 }
00084 output[i] = 0;
00085
00086 printf(output);
00087 }
00088
00089 static void
00090 printhdr(uint8_t *hdr, int len)
00091 {
00092 int i, j;
00093
00094 j = 0;
00095 for(i = 0; i < len; ++i) {
00096 printbin(hdr[i], 8);
00097 printf(" (0x%0x), ", hdr[i]);
00098 ++j;
00099 if(j == 10) {
00100 printf("\n");
00101 j = 0;
00102 }
00103 }
00104
00105 if(j != 0) {
00106 printf("\n");
00107 }
00108 }
00109 #endif
00110
00111 struct channel *
00112 chameleon_parse(void)
00113 {
00114 struct channel *c = NULL;
00115 PRINTF("%d.%d: chameleon_input\n",
00116 rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1]);
00117 #if DEBUG
00118 printhdr(packetbuf_dataptr(), packetbuf_datalen());
00119 #endif
00120 c = CHAMELEON_MODULE.input();
00121 if(c != NULL) {
00122 PRINTF("%d.%d: chameleon_input channel %d\n",
00123 rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1],
00124 c->channelno);
00125 packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno);
00126 } else {
00127 PRINTF("%d.%d: chameleon_input channel not found for incoming packet\n",
00128 rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1]);
00129 }
00130 return c;
00131 }
00132
00133 int
00134 chameleon_create(struct channel *c)
00135 {
00136 int ret;
00137
00138 PRINTF("%d.%d: chameleon_output channel %d\n",
00139 rimeaddr_node_addr.u8[0],rimeaddr_node_addr.u8[1],
00140 c->channelno);
00141
00142 ret = CHAMELEON_MODULE.output(c);
00143 packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c->channelno);
00144 #if DEBUG
00145 printhdr(packetbuf_hdrptr(), packetbuf_hdrlen());
00146 #endif
00147 if(ret) {
00148 return 1;
00149 }
00150 return 0;
00151 }
00152
00153 int
00154 chameleon_hdrsize(const struct packetbuf_attrlist attrlist[])
00155 {
00156 return CHAMELEON_MODULE.hdrsize(attrlist);
00157 }
00158