Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | /* * 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. */ /** * @file * @brief Public API for network interface */ #ifndef __NET_IF_H__ #define __NET_IF_H__ #include <device.h> #include <net/net_linkaddr.h> #include <net/net_ip.h> #ifdef __cplusplus extern "C" { #endif /** * @brief Network Interface unicast IP addresses * * Stores the unicast IP addresses assigned to this network interface. * */ struct net_if_addr { /** Is this IP address used or not */ bool is_used; /** IP address */ struct net_addr address; /** How the IP address was set */ enum net_addr_type addr_type; /** What is the current state of the address */ enum net_addr_state addr_state; /** Is the IP address valid forever */ bool is_infinite; /** Timer that triggers renewal */ struct nano_timer lifetime; #if defined(CONFIG_NET_IPV6) /** Duplicate address detection (DAD) timer */ struct nano_timer dad_timer; /** How many times we have done DAD */ uint8_t dad_count; #endif /* CONFIG_NET_IPV6 */ }; /** * @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; #if defined(CONFIG_NET_IPV6) #define NET_IF_MAX_IPV6_ADDR CONFIG_NET_IFACE_UNICAST_IPV6_ADDR_COUNT struct { /** Unicast IP addresses */ struct net_if_addr unicast[NET_IF_MAX_IPV6_ADDR]; } ipv6; uint8_t hop_limit; #endif /* CONFIG_NET_IPV6 */ }; /** * @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); }; #define NET_IF_INIT(...) /* 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__ */ |