+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_MULTICAST_QUERIER,
+ BRIDGE_ATTR_HASH_MAX,
+ BRIDGE_ATTR_ROBUSTNESS,
+ BRIDGE_ATTR_QUERY_INTERVAL,
+ BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL,
+ BRIDGE_ATTR_LAST_MEMBER_INTERVAL,
+ __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 },
+ [BRIDGE_ATTR_MULTICAST_QUERIER] = { "multicast_querier", BLOBMSG_TYPE_BOOL },
+ [BRIDGE_ATTR_HASH_MAX] = { "hash_max", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_ROBUSTNESS] = { "robustness", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_QUERY_INTERVAL] = { "query_interval", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL] = { "query_response_interval", BLOBMSG_TYPE_INT32 },
+ [BRIDGE_ATTR_LAST_MEMBER_INTERVAL] = { "last_member_interval", BLOBMSG_TYPE_INT32 },
+};
+
+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 device_type *devtype,
+ 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);
+
+static struct device_type bridge_device_type = {
+ .name = "bridge",
+ .config_params = &bridge_attr_list,
+
+ .bridge_capability = true,
+ .name_prefix = "br",
+
+ .create = bridge_create,
+ .config_init = bridge_config_init,
+ .reload = bridge_reload,
+ .free = bridge_free,
+ .dump_info = bridge_dump_info,
+};
+