void eth_drv_send(uint8_t *packet, uint16_t len) { LOG6LBR_PRINTF(PACKET, ETH_OUT, "write: %d\n", len); LOG6LBR_DUMP_PACKET(ETH_OUT, packet, len); eth_dev_output(packet, len); }
/*---------------------------------------------------------------------------*/ static void packet_input(void) { LOG6LBR_PRINTF(PACKET, RADIO_IN, "read: %d\n", packetbuf_datalen()); LOG6LBR_DUMP_PACKET(RADIO_IN, packetbuf_dataptr(), packetbuf_datalen()); if(NETSTACK_FRAMER.parse() < 0) { LOG6LBR_ERROR("br-rdc: failed to parse %u\n", packetbuf_datalen()); native_rdc_parse_error++; } else { NETSTACK_MAC.input(); } }
/*---------------------------------------------------------------------------*/ static void send_packet(mac_callback_t sent, void *ptr) { int size; /* 3 bytes per packet attribute is required for serialization */ uint8_t buf[PACKETBUF_NUM_ATTRS * 3 + PACKETBUF_SIZE + 3]; int sid; packetbuf_set_addr(PACKETBUF_ADDR_SENDER, &linkaddr_node_addr); /* ack or not ? */ packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1); if(NETSTACK_FRAMER.create_and_secure() < 0) { /* Failed to allocate space for headers */ LOG6LBR_ERROR("br-rdc: send failed, too large header\n"); mac_call_sent_callback(sent, ptr, MAC_TX_ERR_FATAL, 1); } else { /* here we send the data over SLIP to the radio-chip */ size = 0; if(sixlbr_config_slip_serialize_tx_attrs) { size = packetutils_serialize_atts(&buf[3], sizeof(buf) - 3); } if(size < 0 || size + packetbuf_totlen() + 3 > sizeof(buf)) { LOG6LBR_ERROR("br-rdc: send failed, too large header\n"); mac_call_sent_callback(sent, ptr, MAC_TX_ERR_FATAL, 1); } else { sid = setup_callback(sent, ptr); if (sid != -1) { LOG6LBR_PRINTF(PACKET, RADIO_OUT, "write: %d (sid: %d, cb: %d)\n", packetbuf_datalen(), sid, callback_count); LOG6LBR_DUMP_PACKET(RADIO_OUT, packetbuf_dataptr(), packetbuf_datalen()); buf[0] = '!'; buf[1] = 'S'; buf[2] = sid; /* sequence or session number for this packet */ /* Copy packet data */ memcpy(&buf[3 + size], packetbuf_hdrptr(), packetbuf_totlen()); callbacks[sid].buf_len = packetbuf_totlen() + size + 3; memcpy(callbacks[sid].buf, buf, callbacks[sid].buf_len); write_to_slip(buf, callbacks[sid].buf_len); } else { LOG6LBR_INFO("native-rdc queue full\n"); mac_call_sent_callback(sent, ptr, MAC_TX_NOACK, 1); } } } }
/*---------------------------------------------------------------------------*/ void eth_drv_input(uint8_t *packet, uint16_t len) { LOG6LBR_PRINTF(PACKET, ETH_IN, "read: %d\n", len); LOG6LBR_DUMP_PACKET(ETH_IN, packet, len); #if CETIC_6LBR_IP64 if((nvm_data.global_flags & CETIC_GLOBAL_IP64) != 0 && (((struct uip_eth_hdr *)packet)->type != UIP_HTONS(UIP_ETHTYPE_IPV6))) { IP64_INPUT(packet, len); } else { #endif uip_len = len - UIP_LLH_LEN; memcpy(uip_buf, packet, len); eth_input(); #if CETIC_6LBR_IP64 } #endif }