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_SPEED, 64 DEV_ATTR_DUPLEX, 65 __DEV_ATTR_MAX, 66 }; 67 68 enum dev_change_type { 69 DEV_CONFIG_NO_CHANGE, 70 DEV_CONFIG_APPLIED, 71 DEV_CONFIG_RESTART, 72 DEV_CONFIG_RECREATE, 73 }; 74 75 struct device_type { 76 struct list_head list; 77 const char *name; 78 79 bool bridge_capability; 80 const char *name_prefix; 81 82 const struct uci_blob_param_list *config_params; 83 84 struct device *(*create)(const char *name, struct device_type *devtype, 85 struct blob_attr *attr); 86 void (*config_init)(struct device *); 87 enum dev_change_type (*reload)(struct device *, struct blob_attr *); 88 void (*vlan_update)(struct device *); 89 void (*dump_info)(struct device *, struct blob_buf *buf); 90 void (*dump_stats)(struct device *, struct blob_buf *buf); 91 int (*check_state)(struct device *); 92 void (*stp_init)(struct device *); 93 void (*free)(struct device *); 94 }; 95 96 enum { 97 DEV_OPT_MTU = (1ULL << 0), 98 DEV_OPT_MACADDR = (1ULL << 1), 99 DEV_OPT_TXQUEUELEN = (1ULL << 2), 100 DEV_OPT_IPV6 = (1ULL << 3), 101 DEV_OPT_PROMISC = (1ULL << 4), 102 DEV_OPT_RPFILTER = (1ULL << 5), 103 DEV_OPT_ACCEPTLOCAL = (1ULL << 6), 104 DEV_OPT_IGMPVERSION = (1ULL << 7), 105 DEV_OPT_MLDVERSION = (1ULL << 8), 106 DEV_OPT_NEIGHREACHABLETIME = (1ULL << 9), 107 DEV_OPT_DEFAULT_MACADDR = (1ULL << 10), 108 DEV_OPT_AUTH = (1ULL << 11), 109 DEV_OPT_MTU6 = (1ULL << 12), 110 DEV_OPT_DADTRANSMITS = (1ULL << 13), 111 DEV_OPT_MULTICAST_TO_UNICAST = (1ULL << 14), 112 DEV_OPT_MULTICAST_ROUTER = (1ULL << 15), 113 DEV_OPT_MULTICAST = (1ULL << 16), 114 DEV_OPT_LEARNING = (1ULL << 17), 115 DEV_OPT_UNICAST_FLOOD = (1ULL << 18), 116 DEV_OPT_NEIGHGCSTALETIME = (1ULL << 19), 117 DEV_OPT_MULTICAST_FAST_LEAVE = (1ULL << 20), 118 DEV_OPT_SENDREDIRECTS = (1ULL << 21), 119 DEV_OPT_NEIGHLOCKTIME = (1ULL << 22), 120 DEV_OPT_ISOLATE = (1ULL << 23), 121 DEV_OPT_IP6SEGMENTROUTING = (1ULL << 24), 122 DEV_OPT_DROP_V4_UNICAST_IN_L2_MULTICAST = (1ULL << 25), 123 DEV_OPT_DROP_V6_UNICAST_IN_L2_MULTICAST = (1ULL << 26), 124 DEV_OPT_DROP_GRATUITOUS_ARP = (1ULL << 27), 125 DEV_OPT_DROP_UNSOLICITED_NA = (1ULL << 28), 126 DEV_OPT_ARP_ACCEPT = (1ULL << 29), 127 DEV_OPT_SPEED = (1ULL << 30), 128 DEV_OPT_DUPLEX = (1ULL << 31), 129 }; 130 131 /* events broadcasted to all users of a device */ 132 enum device_event { 133 DEV_EVENT_ADD, 134 DEV_EVENT_REMOVE, 135 136 DEV_EVENT_UPDATE_IFNAME, 137 DEV_EVENT_UPDATE_IFINDEX, 138 139 DEV_EVENT_SETUP, 140 DEV_EVENT_TEARDOWN, 141 DEV_EVENT_UP, 142 DEV_EVENT_DOWN, 143 144 DEV_EVENT_AUTH_UP, 145 DEV_EVENT_LINK_UP, 146 DEV_EVENT_LINK_DOWN, 147 148 /* Topology changed (i.e. bridge member added) */ 149 DEV_EVENT_TOPO_CHANGE, 150 151 __DEV_EVENT_MAX 152 }; 153 154 /* 155 * device dependency with callbacks 156 */ 157 struct device_user { 158 struct safe_list list; 159 160 bool claimed; 161 bool hotplug; 162 bool alias; 163 164 uint8_t ev_idx[__DEV_EVENT_MAX]; 165 166 struct device *dev; 167 void (*cb)(struct device_user *, enum device_event); 168 }; 169 170 struct device_settings { 171 uint64_t flags; 172 uint64_t valid_flags; 173 unsigned int mtu; 174 unsigned int mtu6; 175 unsigned int txqueuelen; 176 uint8_t macaddr[6]; 177 bool ipv6; 178 bool promisc; 179 unsigned int rpfilter; 180 bool acceptlocal; 181 unsigned int igmpversion; 182 unsigned int mldversion; 183 unsigned int neigh4reachabletime; 184 unsigned int neigh6reachabletime; 185 unsigned int neigh4gcstaletime; 186 unsigned int neigh6gcstaletime; 187 int neigh4locktime; 188 unsigned int dadtransmits; 189 bool multicast_to_unicast; 190 unsigned int multicast_router; 191 bool multicast_fast_leave; 192 bool multicast; 193 bool learning; 194 bool unicast_flood; 195 bool sendredirects; 196 bool ip6segmentrouting; 197 bool isolate; 198 bool drop_v4_unicast_in_l2_multicast; 199 bool drop_v6_unicast_in_l2_multicast; 200 bool drop_gratuitous_arp; 201 bool drop_unsolicited_na; 202 bool arp_accept; 203 bool auth; 204 unsigned int speed; 205 bool duplex; 206 }; 207 208 /* 209 * link layer device. typically represents a linux network device. 210 * can be used to support VLANs as well 211 */ 212 struct device { 213 struct device_type *type; 214 215 struct avl_node avl; 216 struct safe_list users; 217 struct safe_list aliases; 218 219 struct vlist_tree vlans; 220 struct kvlist vlan_aliases; 221 222 char ifname[IFNAMSIZ + 1]; 223 int ifindex; 224 225 struct blob_attr *config; 226 bool config_pending; 227 bool sys_present; 228 /* DEV_EVENT_ADD */ 229 bool present; 230 /* DEV_EVENT_UP */ 231 int active; 232 /* DEV_EVENT_LINK_UP */ 233 bool link_active; 234 bool auth_status; 235 236 bool external; 237 bool disabled; 238 bool deferred; 239 bool hidden; 240 241 bool current_config; 242 bool iface_config; 243 bool default_config; 244 bool wireless; 245 bool wireless_ap; 246 bool wireless_proxyarp; 247 bool wireless_isolate; 248 bool bpdu_filter; 249 250 struct interface *config_iface; 251 252 /* set interface up or down */ 253 device_state_cb set_state; 254 255 const struct device_hotplug_ops *hotplug_ops; 256 257 struct device_user parent; 258 259 struct device_settings orig_settings; 260 struct device_settings settings; 261 }; 262 263 struct device_hotplug_ops { 264 int (*prepare)(struct device *dev, struct device **bridge_dev); 265 int (*add)(struct device *main, struct device *member, struct blob_attr *vlan); 266 int (*del)(struct device *main, struct device *member, struct blob_attr *vlan); 267 }; 268 269 enum bridge_vlan_flags { 270 BRVLAN_F_SELF = (1 << 0), 271 BRVLAN_F_PVID = (1 << 1), 272 BRVLAN_F_UNTAGGED = (1 << 2), 273 }; 274 275 struct bridge_vlan_port { 276 const char *ifname; 277 uint16_t flags; 278 int8_t check; 279 }; 280 281 struct bridge_vlan_hotplug_port { 282 struct list_head list; 283 struct bridge_vlan_port port; 284 }; 285 286 struct bridge_vlan { 287 struct vlist_node node; 288 289 struct bridge_vlan_port *ports; 290 int n_ports; 291 292 struct list_head hotplug_ports; 293 294 uint16_t vid; 295 bool local; 296 bool pending; 297 }; 298 299 extern const struct uci_blob_param_list device_attr_list; 300 extern struct device_type simple_device_type; 301 extern struct device_type tunnel_device_type; 302 303 void device_vlan_update(bool done); 304 void device_stp_init(void); 305 306 int device_type_add(struct device_type *devtype); 307 struct device_type *device_type_get(const char *tname); 308 struct device *device_create(const char *name, struct device_type *type, 309 struct blob_attr *config); 310 void device_merge_settings(struct device *dev, struct device_settings *n); 311 void device_init_settings(struct device *dev, struct blob_attr **tb); 312 void device_init_pending(void); 313 314 enum dev_change_type 315 device_apply_config(struct device *dev, struct device_type *type, 316 struct blob_attr *config); 317 318 void device_reset_config(void); 319 void device_reset_old(void); 320 321 int device_init_virtual(struct device *dev, struct device_type *type, const char *name); 322 int device_init(struct device *dev, struct device_type *type, const char *ifname); 323 void device_cleanup(struct device *dev); 324 struct device *device_find(const char *name); 325 326 struct device *__device_get(const char *name, int create, bool check_vlan); 327 static inline struct device *device_get(const char *name, int create) 328 { 329 return __device_get(name, create, true); 330 } 331 332 void device_add_user(struct device_user *dep, struct device *dev); 333 void device_remove_user(struct device_user *dep); 334 void device_broadcast_event(struct device *dev, enum device_event ev); 335 336 void device_set_present(struct device *dev, bool state); 337 void device_set_link(struct device *dev, bool state); 338 void device_set_ifindex(struct device *dev, int ifindex); 339 int device_set_ifname(struct device *dev, const char *name); 340 void device_refresh_present(struct device *dev); 341 int device_claim(struct device_user *dep); 342 void device_release(struct device_user *dep); 343 int device_check_state(struct device *dev); 344 void device_dump_status(struct blob_buf *b, struct device *dev); 345 346 void device_free_unused(void); 347 348 struct device *get_vlan_device_chain(const char *ifname, int create); 349 void alias_notify_device(const char *name, struct device *dev); 350 struct device *device_alias_get(const char *name); 351 352 void device_set_auth_status(struct device *dev, bool value); 353 354 static inline void 355 device_set_deferred(struct device *dev, bool value) 356 { 357 dev->deferred = value; 358 device_refresh_present(dev); 359 } 360 361 static inline void 362 device_set_disabled(struct device *dev, bool value) 363 { 364 dev->disabled = value; 365 device_refresh_present(dev); 366 } 367 368 static inline bool 369 device_link_active(struct device *dev) 370 { 371 if (dev->settings.auth && !dev->auth_status) 372 return false; 373 374 return dev->link_active; 375 } 376 377 bool device_check_ip6segmentrouting(void); 378 void device_hotplug_event(const char *name, bool add); 379 380 #endif 381
This page was automatically generated by LXR 0.3.1. • OpenWrt