1 /* 2 * netifd - network interface daemon 3 * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 7 * as published by the Free Software Foundation 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 */ 14 #ifndef __NETIFD_DEVICE_H 15 #define __NETIFD_DEVICE_H 16 17 #include <libubox/avl.h> 18 #include <libubox/safe_list.h> 19 #include <libubox/kvlist.h> 20 #include <netinet/in.h> 21 22 struct device; 23 struct device_type; 24 struct device_user; 25 struct device_hotplug_ops; 26 struct bridge_vlan; 27 struct interface; 28 29 typedef int (*device_state_cb)(struct device *, bool up); 30 31 enum { 32 DEV_ATTR_TYPE, 33 DEV_ATTR_MTU, 34 DEV_ATTR_MTU6, 35 DEV_ATTR_MACADDR, 36 DEV_ATTR_TXQUEUELEN, 37 DEV_ATTR_ENABLED, 38 DEV_ATTR_IPV6, 39 DEV_ATTR_PROMISC, 40 DEV_ATTR_RPFILTER, 41 DEV_ATTR_ACCEPTLOCAL, 42 DEV_ATTR_IGMPVERSION, 43 DEV_ATTR_MLDVERSION, 44 DEV_ATTR_NEIGHREACHABLETIME, 45 DEV_ATTR_DADTRANSMITS, 46 DEV_ATTR_MULTICAST_TO_UNICAST, 47 DEV_ATTR_MULTICAST_ROUTER, 48 DEV_ATTR_MULTICAST_FAST_LEAVE, 49 DEV_ATTR_MULTICAST, 50 DEV_ATTR_LEARNING, 51 DEV_ATTR_UNICAST_FLOOD, 52 DEV_ATTR_NEIGHGCSTALETIME, 53 DEV_ATTR_SENDREDIRECTS, 54 DEV_ATTR_NEIGHLOCKTIME, 55 DEV_ATTR_ISOLATE, 56 DEV_ATTR_IP6SEGMENTROUTING, 57 DEV_ATTR_DROP_V4_UNICAST_IN_L2_MULTICAST, 58 DEV_ATTR_DROP_V6_UNICAST_IN_L2_MULTICAST, 59 DEV_ATTR_DROP_GRATUITOUS_ARP, 60 DEV_ATTR_DROP_UNSOLICITED_NA, 61 DEV_ATTR_ARP_ACCEPT, 62 DEV_ATTR_AUTH, 63 DEV_ATTR_AUTH_VLAN, 64 DEV_ATTR_SPEED, 65 DEV_ATTR_DUPLEX, 66 DEV_ATTR_VLAN, 67 DEV_ATTR_PAUSE, 68 DEV_ATTR_ASYM_PAUSE, 69 DEV_ATTR_RXPAUSE, 70 DEV_ATTR_TXPAUSE, 71 DEV_ATTR_AUTONEG, 72 DEV_ATTR_GRO, 73 DEV_ATTR_MASTER, 74 DEV_ATTR_EEE, 75 DEV_ATTR_TAGS, 76 __DEV_ATTR_MAX, 77 }; 78 79 enum dev_change_type { 80 DEV_CONFIG_NO_CHANGE, 81 DEV_CONFIG_APPLIED, 82 DEV_CONFIG_RESTART, 83 DEV_CONFIG_RECREATE, 84 }; 85 86 struct device_type { 87 struct list_head list; 88 const char *name; 89 90 bool bridge_capability; 91 const char *name_prefix; 92 93 const struct uci_blob_param_list *config_params; 94 95 struct device *(*create)(const char *name, struct device_type *devtype, 96 struct blob_attr *attr); 97 void (*config_init)(struct device *); 98 enum dev_change_type (*reload)(struct device *, struct blob_attr *); 99 void (*vlan_update)(struct device *); 100 void (*dump_info)(struct device *, struct blob_buf *buf); 101 void (*dump_stats)(struct device *, struct blob_buf *buf); 102 int (*check_state)(struct device *); 103 void (*stp_init)(struct device *); 104 void (*free)(struct device *); 105 }; 106 107 enum { 108 DEV_OPT_MTU = (1ULL << 0), 109 DEV_OPT_MACADDR = (1ULL << 1), 110 DEV_OPT_TXQUEUELEN = (1ULL << 2), 111 DEV_OPT_IPV6 = (1ULL << 3), 112 DEV_OPT_PROMISC = (1ULL << 4), 113 DEV_OPT_RPFILTER = (1ULL << 5), 114 DEV_OPT_ACCEPTLOCAL = (1ULL << 6), 115 DEV_OPT_IGMPVERSION = (1ULL << 7), 116 DEV_OPT_MLDVERSION = (1ULL << 8), 117 DEV_OPT_NEIGHREACHABLETIME = (1ULL << 9), 118 DEV_OPT_DEFAULT_MACADDR = (1ULL << 10), 119 DEV_OPT_AUTH = (1ULL << 11), 120 DEV_OPT_MTU6 = (1ULL << 12), 121 DEV_OPT_DADTRANSMITS = (1ULL << 13), 122 DEV_OPT_MULTICAST_TO_UNICAST = (1ULL << 14), 123 DEV_OPT_MULTICAST_ROUTER = (1ULL << 15), 124 DEV_OPT_MULTICAST = (1ULL << 16), 125 DEV_OPT_LEARNING = (1ULL << 17), 126 DEV_OPT_UNICAST_FLOOD = (1ULL << 18), 127 DEV_OPT_NEIGHGCSTALETIME = (1ULL << 19), 128 DEV_OPT_MULTICAST_FAST_LEAVE = (1ULL << 20), 129 DEV_OPT_SENDREDIRECTS = (1ULL << 21), 130 DEV_OPT_NEIGHLOCKTIME = (1ULL << 22), 131 DEV_OPT_ISOLATE = (1ULL << 23), 132 DEV_OPT_IP6SEGMENTROUTING = (1ULL << 24), 133 DEV_OPT_DROP_V4_UNICAST_IN_L2_MULTICAST = (1ULL << 25), 134 DEV_OPT_DROP_V6_UNICAST_IN_L2_MULTICAST = (1ULL << 26), 135 DEV_OPT_DROP_GRATUITOUS_ARP = (1ULL << 27), 136 DEV_OPT_DROP_UNSOLICITED_NA = (1ULL << 28), 137 DEV_OPT_ARP_ACCEPT = (1ULL << 29), 138 DEV_OPT_SPEED = (1ULL << 30), 139 DEV_OPT_DUPLEX = (1ULL << 31), 140 DEV_OPT_PAUSE = (1ULL << 32), 141 DEV_OPT_ASYM_PAUSE = (1ULL << 33), 142 DEV_OPT_RXPAUSE = (1ULL << 34), 143 DEV_OPT_TXPAUSE = (1ULL << 35), 144 DEV_OPT_AUTONEG = (1ULL << 36), 145 DEV_OPT_GRO = (1ULL << 37), 146 DEV_OPT_MASTER = (1ULL << 38), 147 DEV_OPT_EEE = (1ULL << 39), 148 }; 149 150 /* events broadcasted to all users of a device */ 151 enum device_event { 152 DEV_EVENT_ADD, 153 DEV_EVENT_REMOVE, 154 155 DEV_EVENT_UPDATE_IFNAME, 156 DEV_EVENT_UPDATE_IFINDEX, 157 158 DEV_EVENT_SETUP, 159 DEV_EVENT_TEARDOWN, 160 DEV_EVENT_UP, 161 DEV_EVENT_DOWN, 162 163 DEV_EVENT_AUTH_UP, 164 DEV_EVENT_LINK_UP, 165 DEV_EVENT_LINK_DOWN, 166 167 /* Topology changed (i.e. bridge member added) */ 168 DEV_EVENT_TOPO_CHANGE, 169 170 __DEV_EVENT_MAX 171 }; 172 173 /* 174 * device dependency with callbacks 175 */ 176 struct device_user { 177 struct safe_list list; 178 179 bool claimed; 180 bool hotplug; 181 bool alias; 182 183 uint8_t ev_idx[__DEV_EVENT_MAX]; 184 185 struct device *dev; 186 void (*cb)(struct device_user *, enum device_event); 187 }; 188 189 struct device_settings { 190 uint64_t flags; 191 uint64_t valid_flags; 192 unsigned int mtu; 193 unsigned int mtu6; 194 unsigned int txqueuelen; 195 uint8_t macaddr[6]; 196 bool ipv6; 197 bool promisc; 198 unsigned int rpfilter; 199 bool acceptlocal; 200 unsigned int igmpversion; 201 unsigned int mldversion; 202 unsigned int neigh4reachabletime; 203 unsigned int neigh6reachabletime; 204 unsigned int neigh4gcstaletime; 205 unsigned int neigh6gcstaletime; 206 int neigh4locktime; 207 unsigned int dadtransmits; 208 bool multicast_to_unicast; 209 unsigned int multicast_router; 210 bool multicast_fast_leave; 211 bool multicast; 212 bool learning; 213 bool unicast_flood; 214 bool sendredirects; 215 bool ip6segmentrouting; 216 bool isolate; 217 bool drop_v4_unicast_in_l2_multicast; 218 bool drop_v6_unicast_in_l2_multicast; 219 bool drop_gratuitous_arp; 220 bool drop_unsolicited_na; 221 bool arp_accept; 222 bool auth; 223 unsigned int speed; 224 bool duplex; 225 bool pause; 226 bool asym_pause; 227 bool rxpause; 228 bool txpause; 229 bool autoneg; 230 bool gro; 231 int master_ifindex; 232 bool eee; 233 }; 234 235 struct device_vlan_range { 236 uint16_t start, end; 237 }; 238 239 /* 240 * link layer device. typically represents a linux network device. 241 * can be used to support VLANs as well 242 */ 243 struct device { 244 struct device_type *type; 245 246 struct avl_node avl; 247 struct safe_list users; 248 struct safe_list aliases; 249 250 struct vlist_tree vlans; 251 struct kvlist vlan_aliases; 252 struct blob_attr *config_auth_vlans; 253 struct blob_attr *auth_vlans; 254 struct blob_attr *tags; 255 256 char ifname[IFNAMSIZ]; 257 int ifindex; 258 259 struct blob_attr *config; 260 bool config_pending; 261 bool sys_present; 262 /* DEV_EVENT_ADD */ 263 bool present; 264 /* DEV_EVENT_UP */ 265 int active; 266 /* DEV_EVENT_LINK_UP */ 267 bool link_active; 268 bool auth_status; 269 270 bool external; 271 bool disabled; 272 bool deferred; 273 bool hidden; 274 275 bool current_config; 276 bool iface_config; 277 bool default_config; 278 bool wireless; 279 bool wireless_ap; 280 bool wireless_proxyarp; 281 bool wireless_isolate; 282 bool bpdu_filter; 283 284 struct interface *config_iface; 285 struct device_vlan_range *extra_vlan; 286 int n_extra_vlan; 287 288 /* set interface up or down */ 289 device_state_cb set_state; 290 291 const struct device_hotplug_ops *hotplug_ops; 292 293 struct device_user parent; 294 295 struct device_settings orig_settings; 296 struct device_settings settings; 297 }; 298 299 struct device_hotplug_ops { 300 int (*prepare)(struct device *dev, struct device **bridge_dev); 301 int (*add)(struct device *main, struct device *member, struct blob_attr *vlan); 302 int (*del)(struct device *main, struct device *member, struct blob_attr *vlan); 303 }; 304 305 enum bridge_vlan_flags { 306 BRVLAN_F_SELF = (1 << 0), 307 BRVLAN_F_PVID = (1 << 1), 308 BRVLAN_F_UNTAGGED = (1 << 2), 309 }; 310 311 struct bridge_vlan_port { 312 const char *ifname; 313 uint16_t flags; 314 int8_t check; 315 }; 316 317 struct bridge_vlan_hotplug_port { 318 struct list_head list; 319 struct bridge_vlan_port port; 320 }; 321 322 struct bridge_vlan { 323 struct vlist_node node; 324 325 struct bridge_vlan_port *ports; 326 int n_ports; 327 328 struct list_head hotplug_ports; 329 330 uint16_t vid; 331 bool local; 332 bool pending; 333 }; 334 335 extern const struct uci_blob_param_list device_attr_list; 336 extern struct device_type simple_device_type; 337 extern struct device_type tunnel_device_type; 338 339 void device_vlan_update(bool done); 340 void device_stp_init(void); 341 342 int device_type_add(struct device_type *devtype); 343 struct device_type *device_type_get(const char *tname); 344 struct device *device_create(const char *name, struct device_type *type, 345 struct blob_attr *config); 346 void device_merge_settings(struct device *dev, struct device_settings *n); 347 void device_init_settings(struct device *dev, struct blob_attr **tb); 348 void device_init_pending(void); 349 350 enum dev_change_type 351 device_apply_config(struct device *dev, struct device_type *type, 352 struct blob_attr *config); 353 354 void device_reset_config(void); 355 void device_reset_old(void); 356 357 int device_init_virtual(struct device *dev, struct device_type *type, const char *name); 358 int device_init(struct device *dev, struct device_type *type, const char *ifname); 359 void device_cleanup(struct device *dev); 360 struct device *device_find(const char *name); 361 362 struct device *__device_get(const char *name, int create, bool check_vlan); 363 static inline struct device *device_get(const char *name, int create) 364 { 365 return __device_get(name, create, true); 366 } 367 368 void device_add_user(struct device_user *dep, struct device *dev); 369 void device_remove_user(struct device_user *dep); 370 const char *device_event_name(enum device_event ev); 371 void __device_broadcast_event(struct device *dev, enum device_event ev); 372 #define device_broadcast_event(dev, ev) do { \ 373 struct device *__ev_dev = (dev); \ 374 D(DEVICE, "%s: event (%s)", \ 375 (__ev_dev && __ev_dev->ifname[0] ? __ev_dev->ifname : "(none)"), \ 376 device_event_name(ev)); \ 377 __device_broadcast_event(__ev_dev, ev); \ 378 } while (0) 379 380 void _device_set_present(struct device *dev, bool state); 381 #define device_set_present(dev, state) do { \ 382 struct device *__ev_dev = (dev); \ 383 bool __ev_state = state; \ 384 D(DEVICE, "%s: set present=%d", \ 385 (__ev_dev && __ev_dev->ifname[0] ? __ev_dev->ifname : "(none)"), \ 386 __ev_state); \ 387 _device_set_present(__ev_dev, __ev_state); \ 388 } while (0) 389 390 void device_set_link(struct device *dev, bool state); 391 void device_set_ifindex(struct device *dev, int ifindex); 392 int device_set_ifname(struct device *dev, const char *name); 393 void device_refresh_present(struct device *dev); 394 int device_claim(struct device_user *dep); 395 void device_release(struct device_user *dep); 396 int device_check_state(struct device *dev); 397 void device_dump_status(struct blob_buf *b, struct device *dev); 398 399 void device_free_unused(void); 400 401 struct device *get_vlan_device_chain(const char *ifname, int create); 402 void alias_notify_device(const char *name, struct device *dev); 403 struct device *device_alias_get(const char *name); 404 405 void device_set_auth_status(struct device *dev, bool value, struct blob_attr *vlans); 406 407 static inline void 408 device_set_deferred(struct device *dev, bool value) 409 { 410 dev->deferred = value; 411 device_refresh_present(dev); 412 } 413 414 static inline void 415 device_set_disabled(struct device *dev, bool value) 416 { 417 dev->disabled = value; 418 device_refresh_present(dev); 419 } 420 421 static inline bool 422 device_link_active(struct device *dev) 423 { 424 if (dev->settings.auth && !dev->auth_status) 425 return false; 426 427 return dev->link_active; 428 } 429 430 bool device_check_ip6segmentrouting(void); 431 void device_hotplug_event(const char *name, bool add); 432 433 #endif 434
This page was automatically generated by LXR 0.3.1. • OpenWrt