diff --git a/drivers/include/net/netdev2_eth.h b/drivers/include/net/netdev2_eth.h new file mode 100644 index 0000000000000000000000000000000000000000..dab519025144fc78899e9e5ce5fad58b091c387b --- /dev/null +++ b/drivers/include/net/netdev2_eth.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.de> + * + * 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 <kaspar@schleiser.de> + */ + +#ifndef NETDEV2_ETH_H +#define NETDEV2_ETH_H + +#include <stdint.h> + +#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 0000000000000000000000000000000000000000..48422e909a47d7cd428d10fa73825060ccc8d8c2 --- /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 0000000000000000000000000000000000000000..8c1be8c39efc09b01c549ec4cd5cee5d40fb0995 --- /dev/null +++ b/drivers/netdev2_eth/netdev2_eth.c @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.de> + * + * 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 <kaspar@schleiser.de> + * + * @} + */ + +#include <assert.h> +#include <errno.h> + +#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; +}