| /* |
| * Copyright (c) 2016 Intel Corporation. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr.h> |
| |
| #include <net/net_core.h> |
| #define NET_LOG_ENABLED 1 |
| #define NET_SYS_LOG_LEVEL 4 |
| #include "net_private.h" |
| |
| #include <net/net_pkt.h> |
| |
| /** FAKE ieee802.15.4 driver **/ |
| #include <net/ieee802154_radio.h> |
| |
| extern struct net_pkt *current_pkt; |
| extern struct k_sem driver_lock; |
| |
| static int fake_cca(struct device *dev) |
| { |
| return 0; |
| } |
| |
| static int fake_set_channel(struct device *dev, u16_t channel) |
| { |
| NET_INFO("Channel %u\n", channel); |
| |
| return 0; |
| } |
| |
| static int fake_set_pan_id(struct device *dev, u16_t pan_id) |
| { |
| NET_INFO("PAN id 0x%x\n", pan_id); |
| |
| return 0; |
| } |
| |
| static int fake_set_short_addr(struct device *dev, u16_t short_addr) |
| { |
| NET_INFO("Short address: 0x%x\n", short_addr); |
| |
| return 0; |
| } |
| |
| static int fake_set_ieee_addr(struct device *dev, const u8_t *ieee_addr) |
| { |
| NET_INFO("IEEE address %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", |
| ieee_addr[0], ieee_addr[1], ieee_addr[2], ieee_addr[3], |
| ieee_addr[4], ieee_addr[5], ieee_addr[6], ieee_addr[7]); |
| |
| return 0; |
| } |
| |
| static int fake_set_txpower(struct device *dev, s16_t dbm) |
| { |
| NET_INFO("TX power %d dbm\n", dbm); |
| |
| return 0; |
| } |
| |
| static inline void insert_frag_dummy_way(struct net_pkt *pkt) |
| { |
| if (current_pkt->frags) { |
| struct net_buf *frag, *prev_frag = NULL; |
| |
| frag = current_pkt->frags; |
| while (frag) { |
| prev_frag = frag; |
| |
| frag = frag->frags; |
| } |
| |
| prev_frag->frags = net_buf_ref(pkt->frags); |
| } else { |
| current_pkt->frags = net_buf_ref(pkt->frags); |
| } |
| } |
| |
| static int fake_tx(struct device *dev, |
| struct net_pkt *pkt, |
| struct net_buf *frag) |
| { |
| NET_INFO("Sending packet %p - length %zu\n", |
| pkt, net_pkt_get_len(pkt)); |
| |
| if (!current_pkt) { |
| return 0; |
| } |
| |
| net_pkt_set_ll_reserve(current_pkt, net_pkt_ll_reserve(pkt)); |
| |
| insert_frag_dummy_way(pkt); |
| |
| k_sem_give(&driver_lock); |
| |
| return 0; |
| } |
| |
| static int fake_start(struct device *dev) |
| { |
| NET_INFO("FAKE ieee802154 driver started\n"); |
| |
| return 0; |
| } |
| |
| static int fake_stop(struct device *dev) |
| { |
| NET_INFO("FAKE ieee802154 driver stopped\n"); |
| |
| return 0; |
| } |
| |
| static void fake_iface_init(struct net_if *iface) |
| { |
| struct ieee802154_context *ctx = net_if_l2_data(iface); |
| static u8_t mac[8] = { 0x00, 0x12, 0x4b, 0x00, |
| 0x00, 0x9e, 0xa3, 0xc2 }; |
| |
| net_if_set_link_addr(iface, mac, 8, NET_LINK_IEEE802154); |
| |
| ctx->pan_id = 0xabcd; |
| ctx->channel = 26; |
| ctx->sequence = 62; |
| |
| NET_INFO("FAKE ieee802154 iface initialized\n"); |
| } |
| |
| static int fake_init(struct device *dev) |
| { |
| fake_stop(dev); |
| |
| return 0; |
| } |
| |
| static struct ieee802154_radio_api fake_radio_api = { |
| .iface_api.init = fake_iface_init, |
| .iface_api.send = ieee802154_radio_send, |
| |
| .cca = fake_cca, |
| .set_channel = fake_set_channel, |
| .set_pan_id = fake_set_pan_id, |
| .set_short_addr = fake_set_short_addr, |
| .set_ieee_addr = fake_set_ieee_addr, |
| .set_txpower = fake_set_txpower, |
| .start = fake_start, |
| .stop = fake_stop, |
| .tx = fake_tx, |
| }; |
| |
| NET_DEVICE_INIT(fake, "fake_ieee802154", |
| fake_init, NULL, NULL, |
| CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, |
| &fake_radio_api, IEEE802154_L2, |
| NET_L2_GET_CTX_TYPE(IEEE802154_L2), 125); |