static void ipsp_connected(struct bt_l2cap_chan *chan) { struct bt_context *ctxt = CHAN_CTXT(chan); struct bt_conn_info info; #if defined(CONFIG_NET_DEBUG_L2_BLUETOOTH) char src[BT_ADDR_LE_STR_LEN]; char dst[BT_ADDR_LE_STR_LEN]; #endif bt_conn_get_info(chan->conn, &info); #if defined(CONFIG_NET_DEBUG_L2_BLUETOOTH) bt_addr_le_to_str(info.le.src, src, sizeof(src)); bt_addr_le_to_str(info.le.dst, dst, sizeof(dst)); NET_DBG("Channel %p Source %s connected to Destination %s", chan, src, dst); #endif /* Swap bytes since net APIs expect big endian address */ sys_memcpy_swap(ctxt->src.val, info.le.src->a.val, sizeof(ctxt->src)); sys_memcpy_swap(ctxt->dst.val, info.le.dst->a.val, sizeof(ctxt->dst)); net_if_set_link_addr(ctxt->iface, ctxt->src.val, sizeof(ctxt->src.val)); /* Set iface up */ net_if_up(ctxt->iface); }
static uint8_t *generate_addressing_fields(struct net_if *iface, struct ieee802154_fcf_seq *fs, struct ieee802154_frame_params *params, uint8_t *p_buf) { struct ieee802154_address_field *af; struct ieee802154_address *src_addr; if (fs->fc.dst_addr_mode != IEEE802154_ADDR_MODE_NONE) { af = (struct ieee802154_address_field *)p_buf; af->plain.pan_id = params->dst.pan_id; if (fs->fc.dst_addr_mode == IEEE802154_ADDR_MODE_SHORT) { af->plain.addr.short_addr = sys_cpu_to_le16(params->dst.short_addr); p_buf += IEEE802154_PAN_ID_LENGTH + IEEE802154_SHORT_ADDR_LENGTH; } else { sys_memcpy_swap(af->plain.addr.ext_addr, params->dst.ext_addr, IEEE802154_EXT_ADDR_LENGTH); p_buf += IEEE802154_PAN_ID_LENGTH + IEEE802154_EXT_ADDR_LENGTH; } } if (fs->fc.src_addr_mode == IEEE802154_ADDR_MODE_NONE) { return p_buf; } af = (struct ieee802154_address_field *)p_buf; if (!fs->fc.pan_id_comp) { af->plain.pan_id = params->pan_id; src_addr = &af->plain.addr; p_buf += IEEE802154_PAN_ID_LENGTH; } else { src_addr = &af->comp.addr; } if (fs->fc.src_addr_mode == IEEE802154_ADDR_MODE_SHORT) { src_addr->short_addr = sys_cpu_to_le16(params->short_addr); p_buf += IEEE802154_SHORT_ADDR_LENGTH; } else { sys_memcpy_swap(src_addr->ext_addr, iface->link_addr.addr, IEEE802154_EXT_ADDR_LENGTH); p_buf += IEEE802154_EXT_ADDR_LENGTH; } return p_buf; }
void ieee802154_init(struct net_if *iface) { struct ieee802154_context *ctx = net_if_l2_data(iface); const struct ieee802154_radio_api *radio = iface->dev->driver_api; const u8_t *mac = iface->link_addr.addr; u8_t long_addr[8]; NET_DBG("Initializing IEEE 802.15.4 stack on iface %p", iface); ieee802154_mgmt_init(iface); #ifdef CONFIG_NET_L2_IEEE802154_SECURITY if (ieee802154_security_init(&ctx->sec_ctx)) { NET_ERR("Initializing link-layer security failed"); } #endif sys_memcpy_swap(long_addr, mac, 8); radio->set_ieee_addr(iface->dev, long_addr); memcpy(ctx->ext_addr, long_addr, 8); if (!radio->set_txpower(iface->dev, CONFIG_NET_L2_IEEE802154_RADIO_DFLT_TX_POWER)) { ctx->tx_power = CONFIG_NET_L2_IEEE802154_RADIO_DFLT_TX_POWER; } radio->start(iface->dev); }
void byteorder_test_memcpy_swap(void) { uint8_t buf_orig[8] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; uint8_t buf_chk[8] = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; uint8_t buf_dst[8] = { 0 }; sys_memcpy_swap(buf_dst, buf_orig, 8); assert_true((memcmp(buf_dst, buf_chk, 8) == 0), "Swap memcpy failed"); sys_memcpy_swap(buf_dst, buf_chk, 8); assert_true((memcmp(buf_dst, buf_orig, 8) == 0), "Swap memcpy failed"); }
static void ipsp_connected(struct bt_l2cap_chan *chan) { struct bt_context *ctxt = CHAN_CTXT(chan); struct bt_conn_info info; struct net_linkaddr ll; struct in6_addr in6; #if defined(CONFIG_NET_DEBUG_L2_BLUETOOTH) char src[BT_ADDR_LE_STR_LEN]; char dst[BT_ADDR_LE_STR_LEN]; #endif bt_conn_get_info(chan->conn, &info); #if defined(CONFIG_NET_DEBUG_L2_BLUETOOTH) bt_addr_le_to_str(info.le.src, src, sizeof(src)); bt_addr_le_to_str(info.le.dst, dst, sizeof(dst)); NET_DBG("Channel %p Source %s connected to Destination %s", chan, src, dst); #endif /* Swap bytes since net APIs expect big endian address */ sys_memcpy_swap(ctxt->src.val, info.le.src->a.val, sizeof(ctxt->src)); sys_memcpy_swap(ctxt->dst.val, info.le.dst->a.val, sizeof(ctxt->dst)); net_if_set_link_addr(ctxt->iface, ctxt->src.val, sizeof(ctxt->src.val), NET_LINK_BLUETOOTH); ll.addr = ctxt->dst.val; ll.len = sizeof(ctxt->dst.val); /* Add remote link-local address to the nbr cache to avoid sending ns: * https://tools.ietf.org/html/rfc7668#section-3.2.3 * A Bluetooth LE 6LN MUST NOT register its link-local address. */ net_ipv6_addr_create_iid(&in6, &ll); net_ipv6_nbr_add(ctxt->iface, &in6, &ll, false, NET_IPV6_NBR_STATE_REACHABLE); /* Set iface up */ net_if_up(ctxt->iface); }
static void get_ieee_addr(void) { u8_t cfg[2] = { '!', 'M' }; u8_t mac[8]; SYS_LOG_DBG(""); /* Send in BE */ sys_memcpy_swap(mac, mac_addr, sizeof(mac)); send_data(cfg, mac, sizeof(mac)); }