Пример #1
0
static void send_packet(void *ptr)
{
    static uint16_t seqno = 0;
    struct app_msg 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++;
    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->next);
            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;
    }
  
    msg.parent_etx = parent_etx;
    msg.rtmetric = rtmetric;
    msg.num_neighbors = num_neighbors;
    msg.beacon_interval = beacon_interval;
    memset(msg.data, 11, sizeof(msg.data) - 2);
    msg.data[10] = seqno;
    uip_udp_packet_sendto(sender_conn, &msg, sizeof(msg),
                           &sink_ipaddr, UIP_HTONS(UDP_SINK_PORT));
    PRINTF("DATA send NO %d to %d * msg size %u\n", seqno,
                sink_ipaddr.u8[sizeof(sink_ipaddr.u8) - 1], sizeof(msg));
    PRINTF("Sink addr : ");
    PRINT6ADDR(&sink_ipaddr);
    PRINTF("\n");
                
}
Пример #2
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;

  /* 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(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);

  uip_udp_packet_sendto(client_conn, &msg, sizeof(msg),
                        &server_ipaddr, UIP_HTONS(UDP_SERVER_PORT));
}