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
};
[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] = {
.next = { &device_attr_list },
};
-static struct device *bridge_create(const char *name, struct blob_attr *attr);
+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);
-const struct device_type bridge_device_type = {
- .name = "Bridge",
+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,
* bridge mtu is set
*/
system_if_apply_settings(&bst->dev, &bst->dev.settings,
- DEV_OPT_MTU);
+ DEV_OPT_MTU | DEV_OPT_MTU6);
}
break;
cfg->forward_delay = 2;
cfg->igmp_snoop = true;
cfg->multicast_querier = true;
+ cfg->robustness = 2;
+ cfg->query_interval = 12500;
+ cfg->query_response_interval = 1000;
+ cfg->last_member_interval = 100;
+ cfg->hash_max = 512;
cfg->bridge_empty = false;
cfg->priority = 0x7FFF;
if ((cur = tb[BRIDGE_ATTR_MULTICAST_QUERIER]))
cfg->multicast_querier = blobmsg_get_bool(cur);
+ if ((cur = tb[BRIDGE_ATTR_HASH_MAX]))
+ cfg->hash_max = blobmsg_get_u32(cur);
+
+ if ((cur = tb[BRIDGE_ATTR_ROBUSTNESS])) {
+ cfg->robustness = blobmsg_get_u32(cur);
+ cfg->flags |= BRIDGE_OPT_ROBUSTNESS;
+ }
+
+ if ((cur = tb[BRIDGE_ATTR_QUERY_INTERVAL])) {
+ cfg->query_interval = blobmsg_get_u32(cur);
+ cfg->flags |= BRIDGE_OPT_QUERY_INTERVAL;
+ }
+
+ if ((cur = tb[BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL])) {
+ cfg->query_response_interval = blobmsg_get_u32(cur);
+ cfg->flags |= BRIDGE_OPT_QUERY_RESPONSE_INTERVAL;
+ }
+
+ if ((cur = tb[BRIDGE_ATTR_LAST_MEMBER_INTERVAL])) {
+ cfg->last_member_interval = blobmsg_get_u32(cur);
+ cfg->flags |= BRIDGE_OPT_LAST_MEMBER_INTERVAL;
+ }
+
if ((cur = tb[BRIDGE_ATTR_AGEING_TIME])) {
cfg->ageing_time = blobmsg_get_u32(cur);
cfg->flags |= BRIDGE_OPT_AGEING_TIME;
}
static struct device *
-bridge_create(const char *name, struct blob_attr *attr)
+bridge_create(const char *name, struct device_type *devtype,
+ struct blob_attr *attr)
{
struct bridge_state *bst;
struct device *dev = NULL;
return NULL;
dev = &bst->dev;
- device_init(dev, &bridge_device_type, name);
+ device_init(dev, devtype, name);
dev->config_pending = true;
bst->retry.cb = bridge_retry_members;
return dev;
}
+
+static void __init bridge_device_type_init(void)
+{
+ device_type_add(&bridge_device_type);
+}