+ DEV_OPT_TXQUEUELEN = (1 << 2),
+ DEV_OPT_IPV6 = (1 << 3),
+ DEV_OPT_PROMISC = (1 << 4),
+ DEV_OPT_RPFILTER = (1 << 5),
+ DEV_OPT_ACCEPTLOCAL = (1 << 6),
+ DEV_OPT_IGMPVERSION = (1 << 7),
+ DEV_OPT_MLDVERSION = (1 << 8),
+};
+
+/* events broadcasted to all users of a device */
+enum device_event {
+ DEV_EVENT_ADD,
+ DEV_EVENT_REMOVE,
+
+ DEV_EVENT_UPDATE_IFNAME,
+ DEV_EVENT_UPDATE_IFINDEX,
+
+ DEV_EVENT_SETUP,
+ DEV_EVENT_TEARDOWN,
+ DEV_EVENT_UP,
+ DEV_EVENT_DOWN,
+
+ DEV_EVENT_LINK_UP,
+ DEV_EVENT_LINK_DOWN,
+
+ /* Topology changed (i.e. bridge member added) */
+ DEV_EVENT_TOPO_CHANGE,
+
+ __DEV_EVENT_MAX
+};
+
+/*
+ * device dependency with callbacks
+ */
+struct device_user {
+ struct safe_list list;
+
+ bool claimed;
+ bool hotplug;
+ bool alias;
+
+ uint8_t ev_idx[__DEV_EVENT_MAX];
+
+ struct device *dev;
+ void (*cb)(struct device_user *, enum device_event);