implement the new update instance alias mechanism for layer2bridging

This commit is contained in:
Anis Ellouze 2016-02-29 12:42:54 +01:00
parent 643ffcc00b
commit e69c87e438
5 changed files with 43 additions and 39 deletions

View file

@ -429,18 +429,25 @@ void update_section_option_list(char *config, char *section, char *option, char
}
}
void update_section_list(char *config, char *section, char *option, int number, char *wlan)
void update_section_list(char *config, char *section, char *option, int number, char *filter)
{
char *add_value;
struct uci_section *s = NULL;
int i = 0;
uci_foreach_option_eq(config, section, option, wlan, s) {
return;
if(option) {
uci_foreach_option_eq(config, section, option, filter, s) {
return;
}
} else {
uci_foreach_sections(config, section, s) {
return;
}
}
while (i<number) {
dmuci_add_section(config, section, &s, &add_value);
dmuci_set_value_by_section(s, option, wlan);
if(option)dmuci_set_value_by_section(s, option, filter);
i++;
}
}

View file

@ -69,6 +69,6 @@ int ipcalc_rev_end(char *ip_str, char *mask_str, char *start_str, char *ipend_st
int network_get_ipaddr(char **value, char *iface);
void remove_vid_interfaces_from_ifname(char *vid, char *ifname, char *new_ifname);
void update_section_option_list(char *config, char *section, char *option, char *option_2,char *val, char *val_2, char *name);
void update_section_list(char *config, char *section, char *option, int number, char *wlan);
void update_section_list(char *config, char *section, char *option, int number, char *filter);
#endif

View file

@ -155,16 +155,13 @@ char *handle_update_instance(int instance_ranck, struct dmctx *ctx, char **last_
char *update_instance(struct uci_section *s, char *last_inst, char *inst_opt)
{
char *instance;
char buf[8] = {0};
void *argv[3];
dmuci_get_value_by_section_string(s, inst_opt, &instance);
if (instance[0] == '\0') {
if (last_inst == NULL)
sprintf(buf, "%d", 1);
else
sprintf(buf, "%d", atoi(last_inst)+1);
instance = dmuci_set_value_by_section(s, inst_opt, buf);
}
argv[0]= s;
argv[1]= inst_opt;
argv[2]= "";
instance = update_instance_alias(0, &last_inst, argv);
return instance;
}

View file

@ -2828,7 +2828,6 @@ inline int entry_landevice_wlanconfiguration_presharedkey(struct dmctx *ctx, cha
update_section_list("dmmap","wlan-psk", "wlan", 10, section_name(wlanargs->lwlansection));
uci_foreach_option_eq("dmmap", "wlan-psk", "wlan", section_name(wlanargs->lwlansection), s) {
wlanargs->pki++;
printf("CHEK PKI = %d \n", wlanargs->pki);
ipk = handle_update_instance(3, ctx, &ipk_last, update_instance_alias, 3, s, "pskinstance", "pskalias");
SUBENTRY(entry_landevice_wlanconfiguration_presharedkey_instance, ctx, idev, iwlan, ipk); //"$wunit" "$wlctl_num" "$uci_num" are not needed
}

View file

@ -20,8 +20,8 @@
inline int entry_layer2_availableinterface_instance(struct dmctx *ctx, char *int_instance);
inline int entry_layer2_marking_instance(struct dmctx *ctx, char *marking_br_instance);
inline int entry_layer2_bridge_instance(struct dmctx *ctx, char *bridge_instance);
inline int entry_layer2_bridge_vlan(struct dmctx *ctx, char *bridge_instance);
inline int entry_layer2_bridge_instance(struct dmctx *ctx, char *bridge_instance, char *bridge_instance_last);
inline int entry_layer2_bridge_vlan(struct dmctx *ctx, char *bridge_instance, char *bridge_instance_last);
inline int entry_layer2_bridge_vlan_instance(struct dmctx *ctx,char *bridge_instance, char *vlan_instance);
int set_marking_bridge_key_sub(char *refparam, struct dmctx *ctx, char *value);
int set_marking_interface_key_sub(char *refparam, struct dmctx *ctx, char *value);
@ -830,7 +830,7 @@ int get_interfaces_type(char *refparam, struct dmctx *ctx, char **value)
return 0;
}
struct uci_section *update_availableinterface_list(char *iface, char **instance)
struct uci_section *update_availableinterface_list(struct dmctx *ctx, char *iface, char **instance, char **instance_last)
{
struct uci_section *s = NULL;
struct uci_section *available_bridge = NULL;
@ -838,12 +838,12 @@ struct uci_section *update_availableinterface_list(char *iface, char **instance)
uci_foreach_option_eq("dmmap", "available-bridge", "baseifname", iface, s)
{
dmuci_get_value_by_section_string(s, "key", instance);
*instance = handle_update_instance(1, ctx, instance_last, update_instance_alias, 3, s, "key", "avbralias");
return s;
}
dmuci_add_section("dmmap", "available-bridge", &available_bridge, &add_value);
dmuci_set_value_by_section(available_bridge, "baseifname", iface);
*instance = update_instance(available_bridge, *instance, "key");
*instance = handle_update_instance(1, ctx, instance_last, update_instance_alias, 3, available_bridge, "key", "avbralias");
return available_bridge;
}
@ -1081,14 +1081,15 @@ inline int entry_layer2_availableinterface(struct dmctx *ctx)
char *oface, *phy_interface, *ch_ptr, *saveptr, *waninstance = NULL;
char *base_ifname, *available_inst = NULL;
struct uci_section *wifi_s , *wan_s, *ai_s;
char *instance_last = NULL;
for (i=0; i<3; i++) {
uci_foreach_sections(wan_interface_tab[i].package, wan_interface_tab[i].section, wan_s) {
waninstance = update_instance(wan_s, waninstance, "waninstance");
dmasprintf(&oface, DMROOT"WANDevice.%s.WANConnectionDevice.%s.", wan_interface_tab[i].instance, waninstance); // MEM WILL BE FREED IN DMMEMCLEAN
dmuci_get_value_by_section_string(wan_s, "baseifname", &base_ifname);
ai_s = update_availableinterface_list(base_ifname, &available_inst);
init_args_layer2(ctx, ai_s, NULL, available_inst, NULL, "WANInterface", oface);
ai_s = update_availableinterface_list(ctx, base_ifname, &available_inst, &instance_last);
init_args_layer2(ctx, ai_s, NULL, instance_last, NULL, "WANInterface", oface);
SUBENTRY(entry_layer2_availableinterface_instance, ctx, available_inst);
}
}
@ -1098,16 +1099,16 @@ inline int entry_layer2_availableinterface(struct dmctx *ctx)
while (ch_ptr != NULL)
{
dmasprintf(&oface, DMROOT"LANInterfaces.LANEthernetInterfaceConfig.%d.", ++i); // MEM WILL BE FREED IN DMMEMCLEAN
ai_s = update_availableinterface_list(ch_ptr, &available_inst);
init_args_layer2(ctx, ai_s, NULL, available_inst, NULL, "LANInterface", oface);
ai_s = update_availableinterface_list(ctx, ch_ptr, &available_inst, &instance_last);
init_args_layer2(ctx, ai_s, NULL, instance_last, NULL, "LANInterface", oface);
SUBENTRY(entry_layer2_availableinterface_instance, ctx, available_inst);
ch_ptr = strtok_r(NULL, " ", &saveptr);
}
i = 0;
uci_foreach_sections("wireless", "wifi-iface", wifi_s) {
dmasprintf(&oface, DMROOT"LANInterfaces.WLANConfiguration.%d.", ++i); // MEM WILL BE FREED IN DMMEMCLEAN
ai_s = update_availableinterface_list(section_name(wifi_s), &available_inst);
init_args_layer2(ctx, ai_s, NULL, available_inst, NULL, "LANInterface", oface);
ai_s = update_availableinterface_list(ctx, section_name(wifi_s), &available_inst, &instance_last);
init_args_layer2(ctx, ai_s, NULL, instance_last, NULL, "LANInterface", oface);
SUBENTRY(entry_layer2_availableinterface_instance, ctx, available_inst);
}
return 0;
@ -1115,39 +1116,39 @@ inline int entry_layer2_availableinterface(struct dmctx *ctx)
inline int entry_layer2_bridge(struct dmctx *ctx)
{
char *bridge_instance = NULL;
char *bridge_instance = NULL, *bridge_instance_last = NULL;
struct uci_section *bridge_s;
uci_foreach_option_eq("network", "interface", "type", "bridge", bridge_s) {
bridge_instance = update_instance(bridge_s, bridge_instance, "bridge_instance");
update_markinginterface_list(bridge_s, bridge_instance);
init_args_layer2(ctx, bridge_s, NULL, NULL, bridge_instance, NULL, NULL);
SUBENTRY(entry_layer2_bridge_instance, ctx, bridge_instance);
bridge_instance = handle_update_instance(1, ctx, &bridge_instance_last, update_instance_alias, 3, bridge_s, "bridge_instance", "bridge_alias");
update_markinginterface_list(bridge_s, bridge_instance_last);
init_args_layer2(ctx, bridge_s, NULL, NULL, bridge_instance_last, NULL, NULL);
SUBENTRY(entry_layer2_bridge_instance, ctx, bridge_instance, bridge_instance_last);
}
return 0;
}
inline int entry_layer2_marking(struct dmctx *ctx)
{
char *marking_instance = NULL;
char *marking_instance = NULL, marking_instance_last = NULL;
struct uci_section *marking_s = NULL;
uci_foreach_sections("dmmap", "marking-bridge", marking_s) {
marking_instance = update_instance(marking_s, marking_instance, "marking_instance");
marking_instance = handle_update_instance(1, ctx, &marking_instance_last, update_instance_alias, 3, marking_s, "marking_instance", "marking_alias");
init_args_layer2(ctx, marking_s, NULL, NULL, NULL, NULL, NULL);
SUBENTRY(entry_layer2_marking_instance, ctx, marking_instance);
}
return 0;
}
inline int entry_layer2_bridge_vlan(struct dmctx *ctx, char *bridge_instance)
inline int entry_layer2_bridge_vlan(struct dmctx *ctx, char *bridge_instance, char *bridge_instance_last)
{
struct uci_section *ss = NULL;
char *vlan_instance = NULL;
char *vlan_instance = NULL, *vlan_instance_last = NULL;
update_bridge_all_vlan_config_bybridge(ctx);
uci_foreach_option_eq("dmmap", "vlan_bridge", "bridgekey", bridge_instance, ss) {
vlan_instance = update_instance(ss, vlan_instance, "vlan_instance");
uci_foreach_option_eq("dmmap", "vlan_bridge", "bridgekey", bridge_instance_last, ss) {
vlan_instance = handle_update_instance(2, ctx, &vlan_instance_last, update_instance_alias, 3, ss, "vlan_instance", "vlan_alias");
init_args_layer2_vlan(ctx, ss);
SUBENTRY(entry_layer2_bridge_vlan_instance, ctx, bridge_instance, vlan_instance);
}
@ -1196,7 +1197,7 @@ inline int entry_layer2_marking_instance(struct dmctx *ctx, char *marking_br_ins
return FAULT_9005;
}
inline int entry_layer2_bridge_instance(struct dmctx *ctx, char *bridge_instance)
inline int entry_layer2_bridge_instance(struct dmctx *ctx, char *bridge_instance, char *bridge_instance_last)
{
IF_MATCH(ctx, DMROOT"Layer2Bridging.Bridge.%s.", bridge_instance) {
DMOBJECT(DMROOT"Layer2Bridging.Bridge.%s.", ctx, "1", 1, NULL, delete_layer2bridging_bridge, NULL, bridge_instance);
@ -1206,7 +1207,7 @@ inline int entry_layer2_bridge_instance(struct dmctx *ctx, char *bridge_instance
DMPARAM("VLANID", ctx, "1", get_bridge_vlanid, set_bridge_vlanid, "xsd:unsignedInt", 0, 1, UNDEF, NULL);
DMPARAM("X_INTENO_COM_AssociatedInterfaces", ctx, "1", get_associated_interfaces, set_associated_interfaces, NULL, 0, 1, UNDEF, NULL);
DMOBJECT(DMROOT"Layer2Bridging.Bridge.%s.VLAN.", ctx, "1", 1, add_layer2bridging_bridge_vlan, delete_layer2bridging_bridge_vlan_all, NULL, bridge_instance);
SUBENTRY(entry_layer2_bridge_vlan, ctx, bridge_instance);
SUBENTRY(entry_layer2_bridge_vlan, ctx, bridge_instance, bridge_instance_last);
return 0;
}
return FAULT_9005;