diff --git a/include/linker/common-ram.ld b/include/linker/common-ram.ld index 5d3cea969ea..c0d26c01c54 100644 --- a/include/linker/common-ram.ld +++ b/include/linker/common-ram.ld @@ -164,3 +164,11 @@ KEEP(*(SORT_BY_NAME("._k_memory_pool*"))) _k_mem_pool_end = .; } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + + SECTION_DATA_PROLOGUE(net_if, (OPTIONAL),) + { + __net_if_start = .; + *(".net_if.*") + KEEP(*(SORT_BY_NAME(".net_if*"))) + __net_if_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) diff --git a/include/net/net_if.h b/include/net/net_if.h index 56a1eb2cff6..d45fcfe8d74 100644 --- a/include/net/net_if.h +++ b/include/net/net_if.h @@ -14,6 +14,118 @@ * limitations under the License. */ -#if defined(CONFIG_NET_UIP) -#include +/** + * @file + * @brief Public API for network interface + */ + +#ifndef __NET_IF_H__ +#define __NET_IF_H__ + +#include + +#include + +#ifdef __cplusplus +extern "C" { #endif + +/** + * @brief Network Interface structure + * + * Used to handle a network interface on top of a device driver instance. + * There can be many net_if instance against the same device. + * + * Such interface is mainly to be used by the link layer, but is also tight + * to a network context: it then makes the relation with a network context + * and the network device. + * + * Because of the strong relationship between a device driver and such + * network interface, each net_if should be instanciated by + */ +struct net_if { + /** The actualy device driver instance the net_if is related to */ + struct device *dev; + + /** The harware link address */ + struct net_linkaddr link_addr; + + /** The hardware MTU */ + uint16_t mtu; +}; + +/** + * @brief Get an network interface's device + * @param iface Pointer to a network interface structure + * @return a pointer on the device driver instance + */ +static inline struct device *net_if_get_device(struct net_if *iface) +{ + return iface->dev; +} + +/** + * @brief Get an network interface's link address + * @param iface Pointer to a network interface structure + * @return a pointer on the network link address + */ +static inline struct net_linkaddr *net_if_get_link_addr(struct net_if *iface) +{ + return &iface->link_addr; +} + +/** + * @brief Set a network interfac's link address + * @param iface Pointer to a network interface structure + * @param addr a pointer on a uint8_t buffer representing the address + * @param len length of the address buffer + */ +static inline void net_if_set_link_addr(struct net_if *iface, + uint8_t *addr, uint8_t len) +{ + iface->link_addr.addr = addr; + iface->link_addr.len = len; +} + +/** + * @brief Get an network interface's MTU + * @param iface Pointer to a network interface structure + * @return the MTU + */ +static inline uint16_t net_if_get_mtu(struct net_if *iface) +{ + return iface->mtu; +} + +struct net_if_api { + void (*init)(struct net_if *iface); +}; + +#ifdef CONFIG_NET_YAIP + +#define NET_IF_INIT(dev_name, sfx, _mtu) \ + static struct net_if (__net_if_ ##dev_name _##sfx) __used \ + __attribute__((__section__(".net_if.data"))) = { \ + .dev = &(__device_##dev_name), \ + .mtu = _mtu, \ + } + +#else + +#define NET_IF_INIT(...) + +#endif /* CONFIG_NET_YAIP */ + +/* Network device intialization macro */ + +#define NET_DEVICE_INIT(dev_name, drv_name, init_fn, \ + data, cfg_info, prio, api, mtu) \ + DEVICE_AND_API_INIT(dev_name, drv_name, init_fn, data, \ + cfg_info, NANOKERNEL, prio, api); \ + NET_IF_INIT(dev_name, 0, mtu) + +#ifdef __cplusplus +} +#endif + +#endif /* __NET_IFACE_H__ */ diff --git a/net/yaip/Kconfig b/net/yaip/Kconfig index eb66aef08f8..f33031b7263 100644 --- a/net/yaip/Kconfig +++ b/net/yaip/Kconfig @@ -15,3 +15,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # + +config NET_YAIP_INIT_PRIO + int + default 99 \ No newline at end of file diff --git a/net/yaip/Makefile b/net/yaip/Makefile index 767191c9d49..1a126f8b9bf 100644 --- a/net/yaip/Makefile +++ b/net/yaip/Makefile @@ -1,2 +1,2 @@ ccflags-y += -I${srctree}/net/ip -obj-y = net_core.o +obj-y = net_core.o net_if.o diff --git a/net/yaip/net_if.c b/net/yaip/net_if.c new file mode 100644 index 00000000000..d2e3db674d7 --- /dev/null +++ b/net/yaip/net_if.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 Intel Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +/* net_if dedicated section limiters */ +extern struct net_if __net_if_start[]; +extern struct net_if __net_if_end[]; + +static int net_if_init(struct device *unused) +{ + struct net_if_api *api; + struct net_if *iface; + + ARG_UNUSED(unused); + + for (iface = __net_if_start; iface != __net_if_end; iface++) { + api = (struct net_if_api *) iface->dev->driver_api; + + if (api && api->init) { + api->init(iface); + } + } + + return 0; +} + +SYS_INIT(net_if_init, NANOKERNEL, CONFIG_NET_YAIP_INIT_PRIO);