/*---------------------------------------------------------------------------*/ static void send_adv(void *ptr) { struct announcement_msg *adata; struct announcement *a; packetbuf_clear(); adata = packetbuf_dataptr(); adata->num = 0; for(a = announcement_list(); a != NULL && a->has_value; a = list_item_next(a)) { adata->data[adata->num].id = a->id; adata->data[adata->num].value = a->value; adata->num++; } packetbuf_set_datalen(ANNOUNCEMENT_MSG_HEADERLEN + sizeof(struct announcement_data) * adata->num); PRINTF("%d.%d: sending neighbor advertisement with %d announcements\n", rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], adata->num); if(adata->num > 0) { /* Send the packet only if it contains more than zero announcements. */ broadcast_send(&c.c); } PRINTF("%d.%d: sending neighbor advertisement with val %d\n", rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], c.val); }
/*---------------------------------------------------------------------------*/ static int format_announcement(char *hdr) { struct announcement_msg adata; struct announcement *a; /* Construct the announcements */ /* adata = (struct announcement_msg *)hdr;*/ adata.num = 0; for(a = announcement_list(); a != NULL && adata.num < ANNOUNCEMENT_MAX; a = list_item_next(a)) { adata.data[adata.num].id = a->id; adata.data[adata.num].value = a->value; adata.num++; } memcpy(hdr, &adata, sizeof(struct announcement_msg)); if(adata.num > 0) { return ANNOUNCEMENT_MSG_HEADERLEN + sizeof(struct announcement_data) * adata.num; } else { return 0; } }
/*---------------------------------------------------------------------------*/ static void send_adv(clock_time_t interval) { struct announcement_msg *adata; struct announcement *a; packetbuf_clear(); adata = packetbuf_dataptr(); adata->num = 0; for(a = announcement_list(); a != NULL; a = a->next) { adata->data[adata->num].id = a->id; adata->data[adata->num].value = a->value; adata->num++; } packetbuf_set_datalen(ANNOUNCEMENT_MSG_HEADERLEN + sizeof(struct announcement_data) * adata->num); PRINTF("%d.%d: sending neighbor advertisement with %d announcements\n", rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], adata->num); if(adata->num > 0) { /* Send the packet only if it contains more than zero announcements. */ ipolite_send(&c.c, interval, packetbuf_datalen()); } }
/*---------------------------------------------------------------------------*/ static int format_announcement(char *hdr) { struct announcement_msg *adata; struct announcement *a; /* Construct the announcements */ adata = (struct announcement_msg *)hdr; adata->num = 0; for(a = announcement_list(); a != NULL && adata->num < ANNOUNCEMENT_MAX; a = a->next) { adata->data[adata->num].id = a->id; adata->data[adata->num].value = a->value; adata->num++; } if(adata->num > 0) { return ANNOUNCEMENT_MSG_HEADERLEN + sizeof(struct announcement_data) * adata->num; } else { return 0; } }
/** * Send a probe packet. */ static void send_probe(void) { struct lpp_hdr *hdr; struct announcement_msg *adata; struct announcement *a; /* Set up the probe header. */ packetbuf_clear(); packetbuf_set_datalen(sizeof(struct lpp_hdr)); hdr = packetbuf_dataptr(); hdr->type = TYPE_PROBE; rimeaddr_copy(&hdr->sender, &rimeaddr_node_addr); /* rimeaddr_copy(&hdr->receiver, packetbuf_addr(PACKETBUF_ADDR_RECEIVER));*/ rimeaddr_copy(&hdr->receiver, &rimeaddr_null); packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &rimeaddr_null); { int hdrlen = NETSTACK_FRAMER.create(); if(hdrlen == 0) { /* Failed to send */ return; } } /* Construct the announcements */ adata = (struct announcement_msg *)((char *)hdr + sizeof(struct lpp_hdr)); adata->num = 0; for(a = announcement_list(); a != NULL; a = list_item_next(a)) { adata->data[adata->num].id = a->id; adata->data[adata->num].value = a->value; adata->num++; } packetbuf_set_datalen(sizeof(struct lpp_hdr) + ANNOUNCEMENT_MSG_HEADERLEN + sizeof(struct announcement_data) * adata->num); /* PRINTF("Sending probe\n");*/ /* printf("probe\n");*/ if(NETSTACK_RADIO.channel_clear()) { NETSTACK_RADIO.send(packetbuf_hdrptr(), packetbuf_totlen()); } else { off_time_adjustment = random_rand() % (OFF_TIME / 2); } compower_accumulate(&compower_idle_activity); }
/** * Send a probe packet. */ static void send_probe(void) { struct lpp_hdr *hdr; struct announcement_msg *adata; struct announcement *a; /* Set up the probe header. */ packetbuf_clear(); packetbuf_set_datalen(sizeof(struct lpp_hdr)); hdr = packetbuf_dataptr(); hdr->type = TYPE_PROBE; rimeaddr_copy(&hdr->sender, &rimeaddr_node_addr); rimeaddr_copy(&hdr->receiver, packetbuf_addr(PACKETBUF_ADDR_RECEIVER)); /* Construct the announcements */ adata = (struct announcement_msg *)((char *)hdr + sizeof(struct lpp_hdr)); adata->num = 0; for(a = announcement_list(); a != NULL; a = a->next) { adata->data[adata->num].id = a->id; adata->data[adata->num].value = a->value; adata->num++; } packetbuf_set_datalen(sizeof(struct lpp_hdr) + ANNOUNCEMENT_MSG_HEADERLEN + sizeof(struct announcement_data) * adata->num); /* PRINTF("Sending probe\n");*/ /* printf("probe\n");*/ /* XXX should first check access to the medium (CCA - Clear Channel Assessment) and add LISTEN_TIME to off_time_adjustment if there is a packet in the air. */ radio->send(packetbuf_hdrptr(), packetbuf_totlen()); compower_accumulate(&compower_idle_activity); }