Merge branch '4.3_vlan' into 'release-4.3'

Refs #17345: Manage VLAN priority through TR069 in case of unmannged bridge

See merge request iopsys/icwmp!16
This commit is contained in:
Omar Kallel 2019-12-04 16:07:39 +01:00
commit 82edb0813f
2 changed files with 62 additions and 10 deletions

View file

@ -80,6 +80,7 @@ DMLEAF tbridge_vlanParam[] = {
{"VLANEnable", &DMWRITE, DMT_BOOL, get_bridge_vlan_enable, set_bridge_vlan_enable, NULL, NULL},
{"VLANName", &DMWRITE, DMT_STRING, get_bridge_vlan_name, set_bridge_vlan_name, NULL, NULL},
{"VLANID", &DMWRITE, DMT_UNINT, get_bridge_vlan_vid, set_bridge_vlan_vid, NULL, NULL},
{CUSTOM_PREFIX"VLANPriority", &DMWRITE, DMT_UNINT, get_bridge_vlan_priority, set_bridge_vlan_priority, NULL, NULL},
{0}
};
@ -321,7 +322,7 @@ char *layer2_get_last_section_instance(char *package, char *section, char *opt_i
return inst;
}
int update_bridge_vlan_config(char *vid, char *bridge_key, char* ifname)
int update_bridge_vlan_config(char *vid, char *priority, char *bridge_key, char* ifname)
{
struct uci_section *s, *ss;
char *add_value, *instance, *p;
@ -337,6 +338,7 @@ int update_bridge_vlan_config(char *vid, char *bridge_key, char* ifname)
DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "bridgekey", bridge_key);
DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "name", name);
DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "vid", vid);
DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "priority", priority);
DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "ifname", ifname);
dmfree(name);
return 0;
@ -344,17 +346,19 @@ int update_bridge_vlan_config(char *vid, char *bridge_key, char* ifname)
int update_bridge_all_vlan_config_bybridge(struct dmctx *ctx, struct args_layer2 *curr_args)
{
char *ifname, *pch, *spch, *vid, *type;
char *ifname = NULL, *pch = NULL, *spch = NULL, *vid = NULL, *type = NULL, *priority = NULL;
struct uci_section *s, *ss;
uci_foreach_sections("network", "device", s) {
if(!s)
break;
dmuci_get_value_by_section_string(s, "ifname", &ifname);
if (strncmp(ifname, wan_baseifname, 4) == 0 || strncmp(ifname, "ptm", 3) == 0 || strncmp(ifname, "atm", 3) == 0) {
if (ifname != NULL && strncmp(ifname, wan_baseifname, 4) == 0 || strncmp(ifname, "ptm", 3) == 0 || strncmp(ifname, "atm", 3) == 0) {
dmuci_get_value_by_section_string(s, "type", &type);
if (strcmp(type, "untagged")) {
if (type != NULL && strcmp(type, "untagged") != 0) {
dmuci_get_value_by_section_string(s, "vid", &vid);
update_bridge_vlan_config(vid, curr_args->bridge_instance, ifname);
dmuci_get_value_by_section_string(s, "priority", &priority);
if(vid != NULL && priority != NULL)
update_bridge_vlan_config(vid, priority, curr_args->bridge_instance, ifname);
}
}
}
@ -927,6 +931,30 @@ int set_bridge_vlan_vid(char *refparam, struct dmctx *ctx, void *data, char *ins
return 0;
}
int get_bridge_vlan_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
struct args_layer2 *args = (struct args_layer2 *)data;
dmuci_get_value_by_section_string(args->layer2sectionlev2, "priority", value);
return 0;
}
int set_bridge_vlan_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
{
struct uci_section *br_sec;
struct args_layer2 *args;
switch (action) {
case VALUECHECK:
return 0;
case VALUESET:
args = (struct args_layer2 *)data;
br_sec = args->layer2sectionlev2;
set_bridge_vlan_priority_sub(br_sec, value);
return 0;
}
return 0;
}
int set_bridge_vlan_vid_sub(struct uci_section *br_sec, struct uci_section *vb, char *value)
{
char *enable, *bkey, *cval, *ifname, *baseifname, *br_ifname, *new_baseifname;
@ -968,6 +996,24 @@ int set_bridge_vlan_vid_sub(struct uci_section *br_sec, struct uci_section *vb,
return 0;
}
int set_bridge_vlan_priority_sub(struct uci_section *vb, char *value)
{
char *cval = NULL, *vid = NULL;
struct uci_section *vlan_s = NULL;
dmuci_get_value_by_section_string(vb, "priority", &cval);
dmuci_get_value_by_section_string(vb, "vid", &vid);
if (cval == NULL || strcmp(cval, value) == 0)
return 0;
if (vid == NULL)
return 0;
uci_foreach_option_eq("network", "device", "vid", vid, vlan_s) {
dmuci_set_value_by_section(vlan_s, "priority", value);
break;
}
DMUCI_SET_VALUE_BY_SECTION(icwmpd, vb, "priority", value);
return 0;
}
int get_bridge_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
{
json_object *res;
@ -1343,10 +1389,13 @@ int delete_layer2bridging_marking(char *refparam, struct dmctx *ctx, void *data,
int add_layer2bridging_bridge_vlan(char *refparam, struct dmctx *ctx, void *data, char **instance)
{
struct args_layer2 *args_bridge = (struct args_layer2 *)data;
char *value, *last_instance, *vid_n, *new_vid, *dev_name, *s_name, *v_name = NULL;
char *value, *last_instance, *vid_n, *new_vid, *dev_name, *s_name, *v_name = NULL, *is_lan=NULL;
struct uci_section *vlan_s, *s, *ss;
int v1, v2 = 2;
dmuci_get_value_by_section_string(args_bridge->layer2section, "is_lan", &is_lan);
if(strcmp(is_lan, "1") == 0){
return FAULT_9001;
}
last_instance = get_last_instance_lev2(DMMAP, "vlan_bridge", "vlan_instance", "bridgekey", args_bridge->bridge_instance);
//Add new section to icwmpd.dmmap.vlan_bridge
DMUCI_ADD_SECTION(icwmpd, "dmmap", "vlan_bridge", &vlan_s, &value);

View file

@ -19,12 +19,12 @@ extern DMLEAF tlayer2_bridgeParam[];
extern DMLEAF tlayer2_markingParam[];
extern DMLEAF tavailableinterfaceParam[];
struct wan_interface
struct wan_interface
{
char *instance;
char *name;
char *package;
char *section;
char *section;
};
struct args_layer2
@ -72,6 +72,8 @@ int get_bridge_vlan_name(char *refparam, struct dmctx *ctx, void *data, char *in
int set_bridge_vlan_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
int get_bridge_vlan_vid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
int set_bridge_vlan_vid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
int get_bridge_vlan_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
int set_bridge_vlan_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
int get_bridge_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
int set_bridge_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
int get_bridge_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
@ -85,7 +87,7 @@ int get_available_interface_key(char *refparam, struct dmctx *ctx, void *data, c
int get_interface_reference(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
int get_interfaces_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
char *layer2_get_last_section_instance(char *package, char *section, char *opt_inst);
int update_bridge_vlan_config(char *vid, char *bridge_key, char* ifname);
int update_bridge_vlan_config(char *vid, char *priority, char *bridge_key, char* ifname);
int update_bridge_all_vlan_config_bybridge(struct dmctx *ctx, struct args_layer2 *curr_args);
void update_add_vlan_interfaces(char *bridge_key, char *vid);
void update_remove_vlan_interfaces(char *bridge_key, char *vid);
@ -99,4 +101,5 @@ int get_brvlan_alias(char *refparam, struct dmctx *ctx, void *data, char *instan
int set_brvlan_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
int get_marking_interface_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
int set_bridge_vlan_vid_sub(struct uci_section *br_sec, struct uci_section *vb, char *value);
int set_bridge_vlan_priority_sub(struct uci_section *vb, char *value);
#endif