summaryrefslogtreecommitdiffhomepage
path: root/device.h
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-02-19 15:21:52 +0100
committerFelix Fietkau <nbd@openwrt.org>2011-03-27 01:42:33 +0100
commit5d1fff7af6f77c9bf0d46572c7af563cd9fc55b3 (patch)
tree76d080e6b59f9235cd47b0e047f662c1f0a6ce00 /device.h
Initial import
Diffstat (limited to 'device.h')
-rw-r--r--device.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/device.h b/device.h
new file mode 100644
index 0000000..9e7d309
--- /dev/null
+++ b/device.h
@@ -0,0 +1,95 @@
+#ifndef __LL_H
+#define __LL_H
+
+#include <libubox/avl.h>
+
+struct device;
+struct device_hotplug_ops;
+
+typedef int (*device_state_cb)(struct device *, bool up);
+
+struct device_type {
+ const char *name;
+
+ int (*check_state)(struct device *);
+ void (*free)(struct device *);
+};
+
+/*
+ * link layer device. typically represents a linux network device.
+ * can be used to support VLANs as well
+ */
+struct device {
+ const struct device_type *type;
+
+ struct avl_node avl;
+ struct list_head users;
+
+ char ifname[IFNAMSIZ + 1];
+ int ifindex;
+
+ bool present;
+ int active;
+
+ /* set interface up or down */
+ device_state_cb set_state;
+
+ const struct device_hotplug_ops *hotplug_ops;
+};
+
+/* events broadcasted to all users of a device */
+enum device_event {
+ /* device has been added to the system and can be brought up */
+ DEV_EVENT_ADD,
+
+ /* device has been removed */
+ DEV_EVENT_REMOVE,
+
+ /* device is being brought up */
+ DEV_EVENT_SETUP,
+
+ /* device is being brought down */
+ DEV_EVENT_TEARDOWN,
+
+ /* device has been brought up */
+ DEV_EVENT_UP,
+
+ /* device has been brought down */
+ DEV_EVENT_DOWN,
+
+ /* device has changed its link state to up */
+ DEV_EVENT_LINK_UP,
+
+ /* device has changed its link state to down */
+ DEV_EVENT_LINK_DOWN,
+};
+
+/*
+ * device dependency with callbacks
+ */
+struct device_user {
+ struct list_head list;
+
+ struct device *dev;
+ void (*cb)(struct device_user *, enum device_event);
+};
+
+struct device_hotplug_ops {
+ int (*add)(struct device *main, struct device *member);
+ int (*del)(struct device *main, struct device *member);
+};
+
+int init_device(struct device *iface, const struct device_type *type, const char *ifname);
+void cleanup_device(struct device *iface);
+struct device *get_device(const char *name, bool create);
+void add_device_user(struct device_user *dep, struct device *iface);
+void remove_device_user(struct device_user *dep);
+
+void set_device_present(struct device *dev, bool state);
+int claim_device(struct device *dev);
+void release_device(struct device *dev);
+int check_device_state(struct device *dev);
+
+struct device *get_vlan_device_chain(const char *ifname, bool create);
+
+#endif