+enum {
+ BRIDGE_ATTR_IFNAME,
+ BRIDGE_ATTR_STP,
+ BRIDGE_ATTR_FORWARD_DELAY,
+ BRIDGE_ATTR_PRIORITY,
+ BRIDGE_ATTR_IGMP_SNOOP,
+ BRIDGE_ATTR_AGEING_TIME,
+ BRIDGE_ATTR_HELLO_TIME,
+ BRIDGE_ATTR_MAX_AGE,
+ BRIDGE_ATTR_BRIDGE_EMPTY,
+ __BRIDGE_ATTR_MAX
+};
+
+static const struct blobmsg_policy bridge_attrs[__BRIDGE_ATTR_MAX] = {
+ [BRIDGE_ATTR_IFNAME] = { "ifname", BLOBMSG_TYPE_ARRAY },
+ [BRIDGE_ATTR_STP] = { "stp", BLOBMSG_TYPE_BOOL },
+ [BRIDGE_ATTR_FORWARD_DELAY] = { "forward_delay", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_PRIORITY] = { "priority", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_AGEING_TIME] = { "ageing_time", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_HELLO_TIME] = { "hello_time", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_MAX_AGE] = { "max_age", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_IGMP_SNOOP] = { "igmp_snooping", BLOBMSG_TYPE_BOOL },
+ [BRIDGE_ATTR_BRIDGE_EMPTY] = { "bridge_empty", BLOBMSG_TYPE_BOOL },
+};
+
+static const struct uci_blob_param_info bridge_attr_info[__BRIDGE_ATTR_MAX] = {
+ [BRIDGE_ATTR_IFNAME] = { .type = BLOBMSG_TYPE_STRING },
+};
+
+static const struct uci_blob_param_list bridge_attr_list = {
+ .n_params = __BRIDGE_ATTR_MAX,
+ .params = bridge_attrs,
+ .info = bridge_attr_info,
+
+ .n_next = 1,
+ .next = { &device_attr_list },
+};
+
+static struct device *bridge_create(const char *name, struct blob_attr *attr);
+static void bridge_config_init(struct device *dev);
+static void bridge_free(struct device *dev);
+static void bridge_dump_info(struct device *dev, struct blob_buf *b);
+enum dev_change_type
+bridge_reload(struct device *dev, struct blob_attr *attr);
+
+const struct device_type bridge_device_type = {
+ .name = "Bridge",
+ .config_params = &bridge_attr_list,
+
+ .create = bridge_create,
+ .config_init = bridge_config_init,
+ .reload = bridge_reload,
+ .free = bridge_free,
+ .dump_info = bridge_dump_info,
+};
+