60 struct announcement_data {
65 #ifdef POLITE_ANNOUNCEMENT_CONF_MAX_DUPS
66 #define NUM_DUPS POLITE_ANNOUNCEMENT_CONF_MAX_DUPS
71 #define ANNOUNCEMENT_MSG_HEADERLEN 2
72 struct announcement_msg {
74 struct announcement_data data[];
78 static struct polite_announcement_state {
81 clock_time_t interval;
82 clock_time_t min_interval, max_interval;
88 #define PRINTF(...) printf(__VA_ARGS__)
93 #define MIN(a, b) ((a)<(b)?(a):(b))
97 send_adv(clock_time_t interval)
99 struct announcement_msg *adata;
106 adata->data[adata->num].id = a->id;
107 adata->data[adata->num].value = a->value;
112 sizeof(
struct announcement_data) * adata->num);
114 PRINTF(
"%d.%d: sending neighbor advertisement with %d announcements\n",
124 adv_packet_received(
struct ipolite_conn *ipolite,
const linkaddr_t *from)
126 struct announcement_msg adata;
127 struct announcement_data data;
134 memcpy(&adata, ptr,
sizeof(
struct announcement_msg));
135 PRINTF(
"%d.%d: adv_packet_received from %d.%d with %d announcements\n",
137 from->u8[0], from->u8[1], adata.num);
139 if(ANNOUNCEMENT_MSG_HEADERLEN + adata.num *
sizeof(
struct announcement_data) >
packetbuf_datalen()) {
142 PRINTF(
"adata.num way out there: %d\n", adata.num);
146 ptr += ANNOUNCEMENT_MSG_HEADERLEN;
147 for(i = 0; i < adata.num; ++i) {
149 memcpy(&data, ptr,
sizeof(
struct announcement_data));
151 ptr +=
sizeof(
struct announcement_data);
156 send_timer(
void *ptr)
158 send_adv(c.interval);
163 c.interval = MIN(c.interval * 2, c.max_interval);
167 new_announcement(uint16_t
id, uint8_t has_value, uint16_t newval,
168 uint16_t oldval, uint8_t bump)
170 if(newval != oldval) {
171 c.interval = c.min_interval;
177 {adv_packet_received,
NULL, NULL};
180 polite_announcement_init(uint16_t channel,
184 ipolite_open(&c.c, channel, NUM_DUPS, &ipolite_callbacks);
186 c.min_interval = min;
187 c.max_interval = max;
193 polite_announcement_stop(
void)