Example #1
0
// Collect data function.  Identical to the collect-view-data process, but a function.
void collect_data(struct shell_command *c) {
	struct collect_view_data_msg msg;
	struct collect_neighbor *n;
	uint16_t parent_etx;
	uint16_t num_neighbors;
	uint16_t beacon_interval;

	n = collect_neighbor_list_find(&shell_collect_conn.neighbor_list,
		                         &shell_collect_conn.parent);
	if(n != NULL) {
		parent_etx = collect_neighbor_link_estimate(n);
	} else {
		parent_etx = 0;
	}
	num_neighbors = collect_neighbor_list_num(&shell_collect_conn.neighbor_list);
	beacon_interval = broadcast_announcement_beacon_interval() / CLOCK_SECOND;

	collect_view_construct_message(&msg, &shell_collect_conn.parent,
		                         parent_etx, shell_collect_conn.rtmetric,
		                         num_neighbors, beacon_interval);
	shell_output(c, &msg, sizeof(msg), "", 0);
}
/*-----------------------------------------------------------------------*/
void collect_common_send(void)
{
	static uint8_t seqno;
	struct {
		uint8_t seqno;
		uint8_t for_alignment;
		struct collect_view_data_msg msg;
		uint8_t hop_count;
		uint8_t lifetime;
		uint16_t data[72];
	} msg;
	
	uint16_t parent_etx;
	uint16_t rtmetric;
	uint16_t num_neighbors;
	uint16_t beacon_interval;
	rpl_parent_t *preferred_parent;
	rimeaddr_t parent;
	rpl_dag_t *dag;

	if(sender_conn == NULL) {
		return;
	}
	memset(&msg, 0, sizeof(msg));
	seqno++;
	if(seqno == 0) {
		seqno = 128; /* Wrap to 128 to identify restarts */
	}
	msg.seqno = seqno;

	rimeaddr_copy(&parent, &rimeaddr_null);
	parent_etx = 0;

	/* Let's suppose we have only one instance. */
	dag = rpl_get_any_dag();
	if(dag != NULL) {
		preferred_parent = dag->preferred_parent;
		if(preferred_parent != NULL) {
			uip_ds6_nbr_t *nbr;
			nbr = uip_ds6_nbr_lookup(&preferred_parent->addr);
			if(nbr != NULL) {
				/* Use parts of the IPv6 address as the parent address,
				 * in reversed byte order. */
				parent.u8[RIMEADDR_SIZE - 1] = 
					nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 2];
				parent.u8[RIMEADDR_SIZE - 2] =
					nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 1];
				parent_etx = 
				    neighbor_info_get_metric((rimeaddr_t *)&nbr->lladdr)/2;
			}
		}

		rtmetric = dag->rank;
		beacon_interval = 
			(uint16_t) ((2L << dag->instance->dio_intcurrent) / 1000);
		num_neighbors = RPL_PARENT_COUNT(dag);
	} else {
		rtmetric = 0;
		beacon_interval = 0;
		num_neighbors = 0;
	}
	
	collect_view_construct_message(&msg.msg, &parent, parent_etx, rtmetric,
									num_neighbors, beacon_interval);
	memset(msg.data, 12, sizeof(msg.data));
//	PRINTF("The size of the packet is: %d\n", sizeof(msg));
	PRINTF("DATA send NO %d to %d\n", seqno,
				sink_ipaddr.u8[sizeof(sink_ipaddr.u8) - 1]);
//	printf("Send a message: %u \n", seqno);
	uip_udp_packet_sendto(sender_conn, &msg, sizeof(msg),
						  &sink_ipaddr, UIP_HTONS(UDP_SINK_PORT));
//	PRINTF("The size of the packet is: %u\n", sizeof(msg));
}
Example #3
0
/*---------------------------------------------------------------------------*/
void
collect_common_send(void)
{
  static uint8_t seqno;
  struct {
    uint8_t seqno;
    uint8_t for_alignment;
    struct collect_view_data_msg msg;
  } msg;
  /* struct collect_neighbor *n; */
  uint16_t parent_etx;
  uint16_t rtmetric;
  uint16_t num_neighbors;
  uint16_t beacon_interval;
  rpl_parent_t *preferred_parent;
  rimeaddr_t parent;
  rpl_dag_t *dag;

  if(client_conn == NULL) {
    /* Not setup yet */
    return;
  }
  memset(&msg, 0, sizeof(msg));
  seqno++;
  if(seqno == 0) {
    /* Wrap to 128 to identify restarts */
    seqno = 128;
  }
  msg.seqno = seqno;

  rimeaddr_copy(&parent, &rimeaddr_null);
  parent_etx = 0;

  dag = rpl_get_dag(RPL_DEFAULT_INSTANCE);
  if(dag != NULL) {
    preferred_parent = dag->preferred_parent;
    if(preferred_parent != NULL) {
      uip_ds6_nbr_t *nbr;
      nbr = uip_ds6_nbr_lookup(&preferred_parent->addr);
      if(nbr != NULL) {
        /* Use parts of the IPv6 address as the parent address, in reversed byte order. */
        parent.u8[RIMEADDR_SIZE - 1] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 2];
        parent.u8[RIMEADDR_SIZE - 2] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 1];
        parent_etx = neighbor_info_get_metric((rimeaddr_t *) &nbr->lladdr) / 2;
      }
    }
    rtmetric = dag->rank;
    beacon_interval = (uint16_t) ((2L << dag->dio_intcurrent) / 1000);
    num_neighbors = RPL_PARENT_COUNT(dag);
  } else {
    rtmetric = 0;
    beacon_interval = 0;
    num_neighbors = 0;
  }

  /* num_neighbors = collect_neighbor_list_num(&tc.neighbor_list); */
  collect_view_construct_message(&msg.msg, &parent,
                                 parent_etx, rtmetric,
                                 num_neighbors, beacon_interval);

  uip_udp_packet_sendto(client_conn, &msg, sizeof(msg),
                        &server_ipaddr, UIP_HTONS(UDP_SERVER_PORT));
}
Example #4
0
/*---------------------------------------------------------------------------*/
void
collect_common_send(void)
{
  /*For send regular packets*/
  static uint8_t seqno;
  struct {
    /*Changed*/
    uint8_t instance_id;   //RPL_SECOND_INSTANCE
    uint8_t for_alignment;
    uint8_t seqno;
    uint8_t for_alignment1;
    struct collect_view_data_msg msg;
  } msg;
  /* struct collect_neighbor *n; */
  uint16_t parent_etx;
  uint16_t rtmetric;
  uint16_t num_neighbors;
  uint16_t beacon_interval;
  rpl_parent_t *preferred_parent;
  rimeaddr_t parent;
  rpl_instance_t *instance; //changed
  rpl_dag_t *dag;

  if(client_conn == NULL) {
    /* Not setup yet */
    return;
  }
  memset(&msg, 0, sizeof(msg));
  seqno++;
  if(seqno == 0) {
    /* Wrap to 128 to identify restarts */
    seqno = 128;
  }
  msg.instance_id = RPL_SECOND_INSTANCE ; 
  msg.seqno = seqno;

  rimeaddr_copy(&parent, &rimeaddr_null);
  parent_etx = 0;

  /* Let's suppose we have only one instance */
  /*Changed*/
  instance = rpl_get_instance(RPL_DEFAULT_INSTANCE);
  dag = instance->current_dag;
  if(dag != NULL) {
    preferred_parent = dag->preferred_parent;
    if(preferred_parent != NULL) {
      uip_ds6_nbr_t *nbr;
      nbr = uip_ds6_nbr_lookup(rpl_get_parent_ipaddr(preferred_parent));
      if(nbr != NULL) {
        /* Use parts of the IPv6 address as the parent address, in reversed byte order. */
        parent.u8[RIMEADDR_SIZE - 1] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 2];
        parent.u8[RIMEADDR_SIZE - 2] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 1];
        parent_etx = rpl_get_parent_rank((rimeaddr_t *) uip_ds6_nbr_get_ll(nbr)) / 2;
      }
    }
    rtmetric = dag->rank;
    beacon_interval = (uint16_t) ((2L << dag->instance->dio_intcurrent) / 1000);
    num_neighbors = RPL_PARENT_COUNT(dag);
  } else {
    rtmetric = 0;
    beacon_interval = 0;
    num_neighbors = 0;
  }

  /* num_neighbors = collect_neighbor_list_num(&tc.neighbor_list); */
  collect_view_construct_message(&msg.msg, &parent,
                                 parent_etx, rtmetric,
                                 num_neighbors, beacon_interval);
  
  printf ("msg send, %d, %d\n", msg.instance_id, msg.seqno);
  uip_udp_packet_sendto(client_conn, &msg, sizeof(msg),
                        &server_ipaddr, UIP_HTONS(UDP_SERVER_PORT));
}