From fa711ceb8dade9e17efff2c1e008e7c686c19a56 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Mon, 30 Nov 2015 14:01:23 +0100 Subject: [PATCH 1/3] drivers: netdev2: add module for shared ethernet code --- drivers/include/net/netdev2_eth.h | 65 ++++++++++++++++++ drivers/netdev2_eth/Makefile | 1 + drivers/netdev2_eth/netdev2_eth.c | 106 ++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 drivers/include/net/netdev2_eth.h create mode 100644 drivers/netdev2_eth/Makefile create mode 100644 drivers/netdev2_eth/netdev2_eth.c diff --git a/drivers/include/net/netdev2_eth.h b/drivers/include/net/netdev2_eth.h new file mode 100644 index 000000000000..dab519025144 --- /dev/null +++ b/drivers/include/net/netdev2_eth.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2015 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for + * more details. + */ + +/** + * @ingroup drivers_netdev_netdev2 + * @{ + * + * @file + * @brief Definitions for netdev2 common ethernet code + * + * @author Kaspar Schleiser + */ + +#ifndef NETDEV2_ETH_H +#define NETDEV2_ETH_H + +#include + +#include "netdev2.h" +#include "net/netopt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Fallback function for netdev2 ethernet devices' _get function + * + * Supposed to be used by netdev2 drivers as default case. + * + * @warning Driver *MUST* implement NETOPT_ADDRESS case! + * + * @param[in] dev network device descriptor + * @param[in] opt option type + * @param[out] value pointer to store the option's value in + * @param[in] max_len maximal amount of byte that fit into @p value + * + * @return number of bytes written to @p value + * @return <0 on error + */ +int netdev2_eth_get(netdev2_t *dev, netopt_t opt, void *value, size_t max_len); + +/** + * @brief Fallback function for netdev2 ethernet devices' _set function + * + * @param[in] dev network device descriptor + * @param[in] opt option type + * @param[in] value value to set + * @param[in] value_len the length of @p value + * + * @return number of bytes used from @p value + * @return <0 on error + */ +int netdev2_eth_set(netdev2_t *dev, netopt_t opt, void *value, size_t value_len); + +#ifdef __cplusplus +} +#endif +/** @} */ +#endif /* NETDEV2_ETH_H */ diff --git a/drivers/netdev2_eth/Makefile b/drivers/netdev2_eth/Makefile new file mode 100644 index 000000000000..48422e909a47 --- /dev/null +++ b/drivers/netdev2_eth/Makefile @@ -0,0 +1 @@ +include $(RIOTBASE)/Makefile.base diff --git a/drivers/netdev2_eth/netdev2_eth.c b/drivers/netdev2_eth/netdev2_eth.c new file mode 100644 index 000000000000..8c1be8c39efc --- /dev/null +++ b/drivers/netdev2_eth/netdev2_eth.c @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2015 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup driver_netdev2_eth + * @{ + * + * @file + * @brief Common code for netdev2 ethernet drivers + * + * @author Kaspar Schleiser + * + * @} + */ + +#include +#include + +#include "net/netdev2.h" +#include "net/eui64.h" +#include "net/ethernet.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +static int _get_iid(netdev2_t *netdev, eui64_t *value, size_t max_len) +{ + if (max_len < sizeof(eui64_t)) { + return -EOVERFLOW; + } + + uint8_t addr[ETHERNET_ADDR_LEN]; + netdev->driver->get(netdev, NETOPT_ADDRESS, addr, ETHERNET_ADDR_LEN); + ethernet_get_iid(value, addr); + + return sizeof(eui64_t); +} + +int netdev2_eth_get(netdev2_t *dev, netopt_t opt, void *value, size_t max_len) +{ + int res = 0; + + switch (opt) { + case NETOPT_DEVICE_TYPE: + { + uint16_t *tgt = (uint16_t *)value; + *tgt = NETDEV2_TYPE_ETHERNET; + res = 2; + break; + } + case NETOPT_ADDR_LEN: + case NETOPT_SRC_LEN: + { + assert(max_len == 2); + uint16_t *tgt = (uint16_t*)value; + *tgt=6; + res = sizeof(uint16_t); + break; + } + case NETOPT_MAX_PACKET_SIZE: + { + assert(max_len >= 2); + uint16_t *val = (uint16_t*) value; + *val = ETHERNET_DATA_LEN; + res = sizeof(uint16_t); + break; + } + case NETOPT_IS_WIRED: + { + res = 1; + break; + } + case NETOPT_IPV6_IID: + { + return _get_iid(dev, value, max_len); + } + default: + { + res = -ENOTSUP; + break; + } + } + + return res; +} + +int netdev2_eth_set(netdev2_t *dev, netopt_t opt, void *value, size_t value_len) +{ + (void)dev; + (void)value; + (void)value_len; + + int res = 0; + + switch (opt) { + default: + return -ENOTSUP; + } + + return res; +} From 14a54bddce76834cfb852045fc76e862dfa58414 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Mon, 30 Nov 2015 14:01:48 +0100 Subject: [PATCH 2/3] cpu: native: netdev2_tap: make use of netdev2_eth module --- Makefile.dep | 1 + cpu/native/netdev2_tap/netdev2_tap.c | 34 ++-------------------------- 2 files changed, 3 insertions(+), 32 deletions(-) diff --git a/Makefile.dep b/Makefile.dep index 02c957b9c970..f05f8d4191e7 100644 --- a/Makefile.dep +++ b/Makefile.dep @@ -33,6 +33,7 @@ endif ifneq (,$(filter netdev2_tap,$(USEMODULE))) USEMODULE += netif + USEMODULE += netdev2_eth endif ifneq (,$(filter gnrc_zep,$(USEMODULE))) diff --git a/cpu/native/netdev2_tap/netdev2_tap.c b/cpu/native/netdev2_tap/netdev2_tap.c index c881a46b0d70..671681cc4d0a 100644 --- a/cpu/native/netdev2_tap/netdev2_tap.c +++ b/cpu/native/netdev2_tap/netdev2_tap.c @@ -50,6 +50,7 @@ #include "net/eui64.h" #include "net/netdev2.h" +#include "net/netdev2_eth.h" #include "net/ethernet.h" #include "net/ethernet/hdr.h" #include "netdev2_tap.h" @@ -97,18 +98,6 @@ static inline int _set_promiscous(netdev2_t *netdev, int value) return value; } -static inline int _get_iid(netdev2_t *netdev, eui64_t *value, size_t max_len) -{ - if (max_len < sizeof(eui64_t)) { - return -EOVERFLOW; - } - - uint8_t addr[ETHERNET_ADDR_LEN]; - _get_mac_addr(netdev, addr); - ethernet_get_iid(value, addr); - - return sizeof(eui64_t); -} static inline void _isr(netdev2_t *netdev) { if (netdev->event_callback) { @@ -130,13 +119,6 @@ int _get(netdev2_t *dev, netopt_t opt, void *value, size_t max_len) int res = 0; switch (opt) { - case NETOPT_DEVICE_TYPE: - { - uint16_t *tgt = (uint16_t *)value; - *tgt = NETDEV2_TYPE_ETHERNET; - res = 2; - break; - } case NETOPT_ADDRESS: if (max_len < ETHERNET_ADDR_LEN) { res = -EINVAL; @@ -146,24 +128,12 @@ int _get(netdev2_t *dev, netopt_t opt, void *value, size_t max_len) res = ETHERNET_ADDR_LEN; } break; - case NETOPT_ADDR_LEN: - case NETOPT_SRC_LEN: - assert(max_len == 2); - uint16_t *tgt = (uint16_t*)value; - *tgt=6; - res = sizeof(uint16_t); - break; case NETOPT_PROMISCUOUSMODE: *((bool*)value) = (bool)_get_promiscous(dev); res = sizeof(bool); break; - case NETOPT_IPV6_IID: - return _get_iid(dev, value, max_len); - case NETOPT_IS_WIRED: - res = 1; - break; default: - res = -ENOTSUP; + res = netdev2_eth_get(dev, opt, value, max_len); break; } From cd471867e6c6d050ca62fcc416ccaf0a0222f44f Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Mon, 30 Nov 2015 14:02:34 +0100 Subject: [PATCH 3/3] drivers: encx24j600: make use of netdev2_eth module --- drivers/Makefile.dep | 1 + drivers/encx24j600/encx24j600.c | 48 +++------------------------------ 2 files changed, 4 insertions(+), 45 deletions(-) diff --git a/drivers/Makefile.dep b/drivers/Makefile.dep index 26d23cc234a1..8b10a7daed31 100644 --- a/drivers/Makefile.dep +++ b/drivers/Makefile.dep @@ -20,6 +20,7 @@ ifneq (,$(filter dht,$(USEMODULE))) endif ifneq (,$(filter encx24j600,$(USEMODULE))) + USEMODULE += netdev2_eth USEMODULE += xtimer endif diff --git a/drivers/encx24j600/encx24j600.c b/drivers/encx24j600/encx24j600.c index f8abbb5bb218..890a1bb5207f 100644 --- a/drivers/encx24j600/encx24j600.c +++ b/drivers/encx24j600/encx24j600.c @@ -29,6 +29,7 @@ #include "xtimer.h" #include "net/netdev2.h" +#include "net/netdev2_eth.h" #include "net/eui64.h" #include "net/ethernet.h" //#include "net/ethernet/hdr.h" @@ -55,7 +56,6 @@ static uint16_t reg_get(encx24j600_t *dev, uint8_t reg); static void reg_clear_bits(encx24j600_t *dev, uint8_t reg, uint16_t mask); static inline int _packets_available(encx24j600_t *dev); -static int _get_iid(netdev2_t *netdev, eui64_t *value, size_t max_len); static void _get_mac_addr(netdev2_t *dev, uint8_t* buf); /* netdev2 interface */ @@ -64,7 +64,6 @@ static int _recv(netdev2_t *netdev, char* buf, int len); static int _init(netdev2_t *dev); static void _isr(netdev2_t *dev); int _get(netdev2_t *dev, netopt_t opt, void *value, size_t max_len); -int _set(netdev2_t *dev, netopt_t opt, void *value, size_t value_len); const static netdev2_driver_t netdev2_driver_encx24j600 = { .send = _send, @@ -72,7 +71,7 @@ const static netdev2_driver_t netdev2_driver_encx24j600 = { .init = _init, .isr = _isr, .get = _get, - .set = _set, + .set = netdev2_eth_set, }; static inline void lock(encx24j600_t *dev) { @@ -383,31 +382,11 @@ static int _recv(netdev2_t *netdev, char* buf, int len) return payload_len; } -static int _get_iid(netdev2_t *netdev, eui64_t *value, size_t max_len) -{ - if (max_len < sizeof(eui64_t)) { - return -EOVERFLOW; - } - - uint8_t addr[ETHERNET_ADDR_LEN]; - _get_mac_addr(netdev, addr); - ethernet_get_iid(value, addr); - - return sizeof(eui64_t); -} - int _get(netdev2_t *dev, netopt_t opt, void *value, size_t max_len) { int res = 0; switch (opt) { - case NETOPT_DEVICE_TYPE: - { - uint16_t *tgt = (uint16_t *)value; - *tgt = NETDEV2_TYPE_ETHERNET; - res = 2; - break; - } case NETOPT_ADDRESS: if (max_len < ETHERNET_ADDR_LEN) { res = -EINVAL; @@ -417,31 +396,10 @@ int _get(netdev2_t *dev, netopt_t opt, void *value, size_t max_len) res = ETHERNET_ADDR_LEN; } break; - case NETOPT_ADDR_LEN: - case NETOPT_SRC_LEN: - assert(max_len == 2); - uint16_t *tgt = (uint16_t*)value; - *tgt=6; - res = sizeof(uint16_t); - break; - case NETOPT_IPV6_IID: - return _get_iid(dev, value, max_len); default: - res = -ENOTSUP; + res = netdev2_eth_get(dev, opt, value, max_len); break; } return res; } - -int _set(netdev2_t *dev, netopt_t opt, void *value, size_t value_len) -{ - int res = 0; - - switch (opt) { - default: - return -ENOTSUP; - } - - return res; -}