diff --git a/apps/servreg-hack/servreg-hack.c b/apps/servreg-hack/servreg-hack.c index 25cfc8695..8ac77276d 100644 --- a/apps/servreg-hack/servreg-hack.c +++ b/apps/servreg-hack/servreg-hack.c @@ -86,6 +86,8 @@ PROCESS(servreg_hack_process, "Service regstry hack"); static struct etimer sendtimer; +static uint8_t started = 0; + /*---------------------------------------------------------------------------*/ /* Go through the list of registrations and remove those that are too old. */ @@ -117,15 +119,18 @@ purge_registrations(void) void servreg_hack_init(void) { - list_init(others_services); - list_init(own_services); - memb_init(®istrations); + if(started == 0) { + list_init(others_services); + list_init(own_services); + memb_init(®istrations); - process_start(&servreg_hack_process, NULL); + process_start(&servreg_hack_process, NULL); + started = 1; + } } /*---------------------------------------------------------------------------*/ void -servreg_hack_register(servreg_hack_id_t id) +servreg_hack_register(servreg_hack_id_t id, const uip_ipaddr_t *addr) { servreg_hack_item_t *t; struct servreg_hack_registration *r; @@ -149,6 +154,7 @@ servreg_hack_register(servreg_hack_id_t id) } r->id = id; r->seqno = 1; + uip_ipaddr_copy(&r->addr, addr); timer_set(&r->timer, LIFETIME / 2); list_push(own_services, r); @@ -212,8 +218,6 @@ handle_incoming_reg(const uip_ipaddr_t *owner, servreg_hack_id_t id, uint8_t seq now - we might later choose to discard the oldest registration that we have). */ - /* printf("Handle incoming reg id %d seqno %d\n", id, seqno);*/ - for(t = servreg_hack_list_head(); t != NULL; t = list_item_next(t)) { @@ -276,34 +280,28 @@ send_udp_packet(struct uip_udp_conn *conn) uint8_t buf[MAX_BUFSIZE]; int bufptr; servreg_hack_item_t *t; - uip_ds6_addr_t *addr; - - addr = uip_ds6_get_global(-1); - + buf[MSG_FLAGS_OFFSET] = 0; numregs = 0; bufptr = MSG_ADDRS_OFFSET; - - - if(addr != NULL) { - for(t = list_head(own_services); - (bufptr + MSG_ADDRS_LEN <= MAX_BUFSIZE) && t != NULL; - t = list_item_next(t)) { - - uip_ipaddr_copy((uip_ipaddr_t *)&buf[bufptr + MSG_IPADDR_SUBOFFSET], - &addr->ipaddr); - buf[bufptr + MSG_REGS_SUBOFFSET] = - servreg_hack_item_id(t); - buf[bufptr + MSG_REGS_SUBOFFSET + 1] = - buf[bufptr + MSG_REGS_SUBOFFSET + 2] = 0; - buf[bufptr + MSG_SEQNO_SUBOFFSET] = ((struct servreg_hack_registration *)t)->seqno; - - bufptr += MSG_ADDRS_LEN; - ++numregs; - } - } + for(t = list_head(own_services); + (bufptr + MSG_ADDRS_LEN <= MAX_BUFSIZE) && t != NULL; + t = list_item_next(t)) { + + uip_ipaddr_copy((uip_ipaddr_t *)&buf[bufptr + MSG_IPADDR_SUBOFFSET], + servreg_hack_item_address(t)); + buf[bufptr + MSG_REGS_SUBOFFSET] = + servreg_hack_item_id(t); + buf[bufptr + MSG_REGS_SUBOFFSET + 1] = + buf[bufptr + MSG_REGS_SUBOFFSET + 2] = 0; + buf[bufptr + MSG_SEQNO_SUBOFFSET] = ((struct servreg_hack_registration *)t)->seqno; + + bufptr += MSG_ADDRS_LEN; + ++numregs; + } + for(t = servreg_hack_list_head(); (bufptr + MSG_ADDRS_LEN <= MAX_BUFSIZE) && t != NULL; t = list_item_next(t)) { @@ -338,7 +336,7 @@ parse_incoming_packet(const u8_t *buf, int len) numregs = buf[MSG_NUMREGS_OFFSET]; flags = buf[MSG_FLAGS_OFFSET]; - /* printf("Numregs %d flags %d\n", numregs, flags);*/ + /* printf("parse_incoming_packet Numregs %d flags %d\n", numregs, flags);*/ bufptr = MSG_ADDRS_OFFSET; for(i = 0; i < numregs; ++i) { diff --git a/apps/servreg-hack/servreg-hack.h b/apps/servreg-hack/servreg-hack.h index e2ab306ad..57657d381 100644 --- a/apps/servreg-hack/servreg-hack.h +++ b/apps/servreg-hack/servreg-hack.h @@ -81,6 +81,7 @@ void servreg_hack_init(void); /** * \brief Register that this node provides a service * \param service_id The 8-bit ID for the service + * \param addr The address associated with the service * * This function is used to register a * service. Registering a service means that other nodes @@ -91,7 +92,7 @@ void servreg_hack_init(void); * reached: this is up to the application that uses the * servreg-hack application. */ -void servreg_hack_register(servreg_hack_id_t service_id); +void servreg_hack_register(servreg_hack_id_t service_id, const uip_ipaddr_t *addr); /**