uint8_t rpl_init(transceiver_type_t trans, uint16_t rpl_address) { mutex_init(&rpl_send_mutex); mutex_init(&rpl_recv_mutex); if(rpl_address == 0) { return SIXLOWERROR_ADDRESS; } /* initialize routing table */ rpl_clear_routing_table(); init_trickle(); rpl_process_pid = thread_create(rpl_process_buf, RPL_PROCESS_STACKSIZE, PRIORITY_MAIN - 1, CREATE_STACKTEST, rpl_process, "rpl_process"); /* INSERT NEW OBJECTIVE FUNCTIONS HERE */ objective_functions[0] = rpl_get_of0(); /* objective_functions[1] = rpl_get_of_ETX() */ sixlowpan_init(trans, rpl_address, 0); /* Wir benötigen einen Link Local prefix, um unsere entsprechende Addresse im Netz abzufragen */ ipv6_addr_t ll_address; ipv6_set_ll_prefix(&ll_address); ipv6_get_saddr(&my_address, &ll_address); set_rpl_process_pid(rpl_process_pid); return SUCCESS; }
void etx_radio(void) { msg_t m; radio_packet_t *p; ieee802154_frame_t frame; msg_init_queue(msg_que, ETX_RCV_QUEUE_SIZE); ipv6_addr_t ll_address; ipv6_addr_t candidate_addr; ipv6_set_ll_prefix(&ll_address); ipv6_get_saddr(&candidate_addr, &ll_address); while (1) { msg_receive(&m); if (m.type == PKT_PENDING) { p = (radio_packet_t*) m.content.ptr; read_802154_frame(p->data, &frame, p->length); if (frame.payload[0] == ETX_PKT_OPTVAL) { //copy to receive buffer memcpy(etx_rec_buf, &frame.payload[0], frame.payload_len); //create IPv6 address from radio packet //we can do the cast here since rpl nodes can only have addr //up to 8 bits candidate_addr.uint8[ETX_IPV6_LAST_BYTE] = (uint8_t) p->src; //handle the beacon mutex_lock(&etx_mutex); etx_handle_beacon(&candidate_addr); mutex_unlock(&etx_mutex,1); } p->processing--; } else if (m.type == ENOBUFFER) { puts("Transceiver buffer full"); } else { //packet is not for me, whatever } } }