diff --git a/dm/dmcommon.c b/dm/dmcommon.c index cf2cb27..e30be28 100644 --- a/dm/dmcommon.c +++ b/dm/dmcommon.c @@ -13,6 +13,7 @@ #include #include #include +#include char *cut_fx(char *str, char *delimiter, int occurence) { @@ -24,4 +25,26 @@ char *cut_fx(char *str, char *delimiter, int occurence) pch = strtok(NULL, delimiter); } return pch; +} + +char *get_pid(char *pname) +{ + FILE* f = NULL; + char str[TAILLE_MAX] = ""; + char *v; + f = popen(pname, "r"); + if (f != NULL) + { + fgets(str, TAILLE_MAX, f); + if (str[0] == '\0') { + pclose(f); + return dmstrdup(""); + } + pid_t pid = strtoul(str, NULL, 10); + pclose(f); + dmasprintf(&v, "%d", pid); + return v; + } + v = dmstrdup(""); + return v; } \ No newline at end of file diff --git a/dm/dmcommon.h b/dm/dmcommon.h index 5c185a0..4039efa 100644 --- a/dm/dmcommon.h +++ b/dm/dmcommon.h @@ -20,5 +20,6 @@ do { \ } while(0) char *cut_fx(char *str, char *delimiter, int occurence); +char *get_pid(char *pname); #endif \ No newline at end of file diff --git a/dm/dmcwmp.c b/dm/dmcwmp.c index e01c64a..07a9ca6 100644 --- a/dm/dmcwmp.c +++ b/dm/dmcwmp.c @@ -11,10 +11,14 @@ #include "dmuci.h" #include "dmcwmp.h" #include "root.h" +#include "upnp.h" #include "landevice.h" #include "wandevice.h" #include "deviceinfo.h" #include "managementserver.h" +#include "x_inteno_se_igmp.h" +#include "x_inteno_se_wifi.h" +#include "x_inteno_se_ice.h" #include "x_inteno_se_power_mgmt.h" static char *get_parameter_notification (char *param); @@ -66,6 +70,10 @@ const struct prefix_method prefix_methods[] = { { DMROOT"X_INTENO_SE_PowerManagement.", 0, &entry_method_root_X_INTENO_SE_PowerManagement }, { DMROOT"LANDevice.", 0, &entry_method_root_LANDevice }, { DMROOT"WANDevice.", 1, &entry_method_root_WANDevice }, + { DMROOT"X_INTENO_SE_IGMP.", 0, &entry_method_root_X_INTENO_SE_IGMP }, + { DMROOT"X_INTENO_SE_Wifi.", 0, &entry_method_root_SE_Wifi }, + { DMROOT"X_INTENO_SE_ICE.", 0, &entry_method_root_X_INTENO_SE_Ice }, + { DMROOT"UPnP.", 0, &entry_method_root_upnp }, //{ DMROOT"Layer2Bridging.", &entry_method_root_Layer2Bridging }, }; diff --git a/dm/dmtree/upnp.c b/dm/dmtree/upnp.c new file mode 100644 index 0000000..c9185f2 --- /dev/null +++ b/dm/dmtree/upnp.c @@ -0,0 +1,79 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Copyright (C) 2015 Inteno Broadband Technology AB + * Author Imen Bhiri + * + */ + +#include +#include +#include +#include "dmuci.h" +#include "dmubus.h" +#include "dmcwmp.h" +#include "dmcommon.h" +#include "upnp.h" + +int get_upnp_enable(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("upnpd","config","enabled", value); + if (*value[0] == '\0') { + dmfree(*value); + *value = dmstrdup("1"); + } + return 0; +} + +int set_upnp_enable(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + int check; + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + check = string_to_bool(value, &b); + if (check == -1) + return 0; + if(b) + dmuci_set_value("upnpd", "config", "enabled", "1"); + else + dmuci_set_value("upnpd", "config", "enabled", ""); + //delay_service restart "miniupnpd" "1" //TODO + return 0; + } + return 0; +} + +int get_upnp_status(char *refparam, struct dmctx *ctx, char **value) +{ + char *pname = dmstrdup("pidof miniupnpd"); + *value = get_pid(pname); + + if (*value[0] == '\0') { + *value = dmstrdup("Down"); + } + else { + *value = dmstrdup("Up"); + } + dmfree(pname); + return 0; +} + +int entry_method_root_upnp(struct dmctx *ctx) +{ + IF_MATCH(ctx, DMROOT"UPnP.") { + DMOBJECT(DMROOT"UPnP.", ctx, "0", 1, NULL, NULL, NULL); + DMOBJECT(DMROOT"UPnP.Device.", ctx, "0", 1, NULL, NULL, NULL); + DMPARAM("Enable", ctx, "1", get_upnp_enable, set_upnp_enable, "xsd:boolean", 0, 1, UNDEF, NULL); + DMPARAM("X_INTENO_SE_Status", ctx, "0", get_upnp_status, NULL, "", 0, 1, UNDEF, NULL); + return 0; + } + return FAULT_9005; +} \ No newline at end of file diff --git a/dm/dmtree/upnp.h b/dm/dmtree/upnp.h new file mode 100644 index 0000000..bb05632 --- /dev/null +++ b/dm/dmtree/upnp.h @@ -0,0 +1,9 @@ +#ifndef __UPNP_H +#define __UPNP_H + +int get_upnp_enable(char *refparam, struct dmctx *ctx, char **value); +int set_upnp_enable(char *refparam, struct dmctx *ctx, int action, char *value); +int get_upnp_status(char *refparam, struct dmctx *ctx, char **value); +int entry_method_root_upnp(struct dmctx *ctx); + +#endif \ No newline at end of file diff --git a/dm/dmtree/x_inteno_se_ice.c b/dm/dmtree/x_inteno_se_ice.c new file mode 100644 index 0000000..2c1d64e --- /dev/null +++ b/dm/dmtree/x_inteno_se_ice.c @@ -0,0 +1,94 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Copyright (C) 2015 Inteno Broadband Technology AB + * Author Imen Bhiri + * + */ + + +#include +#include +#include +#include "dmuci.h" +#include "dmubus.h" +#include "dmcwmp.h" +#include "dmcommon.h" +#include "x_inteno_se_ice.h" + +int get_ice_cloud_enable(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("ice", "cloud", "enabled", value); + if (strcmp(*value, "1") == 0 || strcmp(*value, "true") == 0 || strcmp(*value, "yes") == 0 || strcmp(*value, "on") == 0) { + dmfree(*value); + *value = dmstrdup("true"); + } + else if (strcmp(*value, "0") == 0 || strcmp(*value, "false") == 0 || strcmp(*value, "no") == 0 || strcmp(*value, "off") == 0) { + dmfree(*value); + *value = dmstrdup("false"); + } + return 0; +} + +int set_ice_cloud_enable(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + int check; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + check = string_to_bool(value, &b); + if(check == -1) + return 0; + if (b) + dmuci_set_value("ice", "cloud", "enabled", "1"); + else + dmuci_set_value("ice", "cloud", "enabled", "0"); + //check if *ice-client exit (if [ -f /etc/rc.d/*ice-client ]) + //delay_service restart "ice-client" "1" TODO + } +} + +int get_ice_cloud_server(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("ice", "cloud", "server", value); + return 0; +} + +int set_ice_cloud_server(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + if (value[0] == '\0') + return 0; + dmuci_set_value("ice", "cloud", "server", value); + //check if *ice-client exit (if [ -f /etc/rc.d/*ice-client ]) + //delay_service restart "ice-client" "1" TODO + return 0; + } + return 0; +} + +int entry_method_root_X_INTENO_SE_Ice(struct dmctx *ctx) +{ + IF_MATCH(ctx, DMROOT"X_INTENO_SE_ICE.") { + DMOBJECT(DMROOT"X_INTENO_SE_ICE.", ctx, "0", 1, NULL, NULL, NULL); + DMPARAM("Enable", ctx, "1", get_ice_cloud_enable, set_ice_cloud_enable, "xsd:boolean", 0, 1, UNDEF, NULL); + DMPARAM("Server", ctx, "1", get_ice_cloud_server, set_ice_cloud_server, "", 0, 1, UNDEF, NULL); + return 0; + } + return FAULT_9005; +} \ No newline at end of file diff --git a/dm/dmtree/x_inteno_se_ice.h b/dm/dmtree/x_inteno_se_ice.h new file mode 100644 index 0000000..3caf7dd --- /dev/null +++ b/dm/dmtree/x_inteno_se_ice.h @@ -0,0 +1,10 @@ +#ifndef __SE_ICE_H +#define __SE_ICE_H + +int get_ice_cloud_enable(char *refparam, struct dmctx *ctx, char **value); +int set_ice_cloud_enable(char *refparam, struct dmctx *ctx, int action, char *value); +int get_ice_cloud_server(char *refparam, struct dmctx *ctx, char **value); +int set_ice_cloud_server(char *refparam, struct dmctx *ctx, int action, char *value); +int entry_method_root_X_INTENO_SE_Ice(struct dmctx *ctx); + +#endif \ No newline at end of file diff --git a/dm/dmtree/x_inteno_se_igmp.c b/dm/dmtree/x_inteno_se_igmp.c new file mode 100644 index 0000000..72a93a8 --- /dev/null +++ b/dm/dmtree/x_inteno_se_igmp.c @@ -0,0 +1,491 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Copyright (C) 2015 Inteno Broadband Technology AB + * Author Imen Bhiri + * + */ + +#include +#include +#include +#include "dmuci.h" +#include "dmubus.h" +#include "dmcwmp.h" +#include "dmcommon.h" +#include "x_inteno_se_igmp.h" + +inline void compress_spaces(char *str) +{ + char *dst = str; + for (; *str; ++str) { + *dst++ = *str; + if (isspace(*str)) { + do ++str; + while (isspace(*str)); + --str; + } + } + *dst = '\0'; +} + +int get_igmp_dscp_mark(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_dscp_mark", value); + return 0; +} + +int set_igmp_dscp_mark(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_dscp_mark", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_proxy_interface(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_proxy_interfaces", value); + //echo ${value// /,} TODO REPLACE SPACE BY ',' + return 0; +} + +int set_igmp_proxy_interface(char *refparam, struct dmctx *ctx, int action, char *value) +{ + int i; + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + if (value[0] == '\0') + return 0; + int ln = strlen(value); + for (i = 0; i< strlen(value); i++) { + if (value[i] == ',') { + value[i] = ' '; + } + } + compress_spaces(value); + dmuci_set_value("mcpd", "mcpd", "igmp_proxy_interfaces", value); + //delay_service restart "mcpd" "1" //TODO + return 0; + } + return 0; +} + +int get_igmp_default_version(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_default_version", value); + return 0; +} + +int set_igmp_default_version(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_default_version", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_query_interval(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_query_interval", value); + return 0; +} + +int set_igmp_query_interval(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_query_interval", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_query_response_interval(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_query_response_interval", value); + return 0; +} + +int set_igmp_query_response_interval(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_query_response_interval", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_last_member_queryinterval(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_last_member_query_interval", value); + return 0; +} + +int set_igmp_last_member_queryinterval(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_last_member_query_interval", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_robustness_value(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_robustness_value", value); + return 0; +} + +int set_igmp_robustness_value(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_robustness_value", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_multicast_enable(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_lan_to_lan_multicast", value); + if ((*value)[0] == '\0') { + dmfree(*value); + *value = dmstrdup("0"); + } + return 0; +} + +int set_igmp_multicast_enable(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + int check; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + if (check == -1) + return 0; + if (b) + dmuci_set_value("mcpd", "mcpd", "igmp_lan_to_lan_multicast", value); + else + dmuci_set_value("mcpd", "mcpd", "igmp_lan_to_lan_multicast", ""); + //delay_service restart "mcpd" "1" //TODO + return 0; + } + return 0; +} + +int get_igmp_fastleave_enable(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_fast_leave", value); + if ((*value)[0] == '\0') { + dmfree(*value); + *value = dmstrdup("0"); + } + return 0; +} + +int set_igmp_fastleave_enable(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + int check; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + check = string_to_bool(value, &b); + if (check == -1) + return 0; + if (b) + dmuci_set_value("mcpd", "mcpd", "igmp_fast_leave", value); + else + dmuci_set_value("mcpd", "mcpd", "igmp_fast_leave", ""); + //delay_service restart "mcpd" "1" //TODO + return 0; + } + return 0; +} + +int get_igmp_joinimmediate_enable(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_join_immediate", value); + if ((*value)[0] == '\0') { + dmfree(*value); + *value = dmstrdup("0"); + } + return 0; +} + +int set_igmp_joinimmediate_enable(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + int check; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + check = string_to_bool(value, &b); + if (check == -1) + return 0; + if (b) + dmuci_set_value("mcpd", "mcpd", "igmp_join_immediate", value); + else + dmuci_set_value("mcpd", "mcpd", "igmp_join_immediate", ""); + //delay_service restart "mcpd" "1" //TODO + return 0; + } + return 0; +} + +int get_igmp_proxy_enable(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_proxy_enable", value); + if ((*value)[0] == '\0') { + dmfree(*value); + *value = dmstrdup("0"); + } + return 0; +} + +int set_igmp_proxy_enable(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + int check; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + check = string_to_bool(value, &b); + if (check == -1) + return 0; + if (b) + dmuci_set_value("mcpd", "mcpd", "igmp_proxy_enable", value); + else + dmuci_set_value("mcpd", "mcpd", "igmp_proxy_enable", ""); + //delay_service restart "mcpd" "1" //TODO + return 0; + } + return 0; +} + +int get_igmp_maxgroup(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_max_groups", value); + return 0; +} + +int set_igmp_maxgroup(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_max_groups", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_maxsources(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_max_sources", value); + return 0; +} + +int set_igmp_maxsources(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_max_sources", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_maxmembers(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_max_members", value); + return 0; +} + +int set_igmp_maxmembers(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_max_members", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_snooping_mode(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_snooping_enable", value); + return 0; +} + +int set_igmp_snooping_mode(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value("mcpd", "mcpd", "igmp_snooping_enable", value); + //delay_service restart "mcpd" "1" TODO + return 0; + } + return 0; +} + +int get_igmp_snooping_interface(char *refparam, struct dmctx *ctx, char **value) +{ + dmuci_get_option_value_string("mcpd", "mcpd", "igmp_snooping_interfaces", value); + // echo ${value// /,} TODO + return 0; +} + +int set_igmp_snooping_interface(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + int i; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + if (value[0] == '\0') + return 0; + int ln = strlen(value); + for (i = 0; i< strlen(value); i++) { + if (value[i] == ',') { + value[i] = ' '; + } + } + compress_spaces(value); + dmuci_set_value("mcpd", "mcpd", "igmp_snooping_interfaces", value); + //delay_service restart "mcpd" "1" //TODO + return 0; + } + return 0; +} + +int entry_method_root_X_INTENO_SE_IGMP(struct dmctx *ctx) +{ + IF_MATCH(ctx, DMROOT"X_INTENO_SE_IGMP.") { + DMOBJECT(DMROOT"X_INTENO_SE_IGMP.", ctx, "0", 1, NULL, NULL, NULL); + DMPARAM("DifferentiateService", ctx, "1", get_igmp_dscp_mark, set_igmp_dscp_mark, "", 0, 1, UNDEF, NULL); + DMPARAM("ProxyInterface", ctx, "1", get_igmp_proxy_interface, set_igmp_proxy_interface, "", 0, 1, UNDEF, NULL); + DMPARAM("DefaultVersion", ctx, "1", get_igmp_default_version, set_igmp_default_version, "", 0, 1, UNDEF, NULL); + DMPARAM("QueryInterval", ctx, "1", get_igmp_query_interval, set_igmp_query_interval, "xsd:unsignedInt", 0, 1, UNDEF, NULL); + DMPARAM("QueryResponseInterval", ctx, "1", get_igmp_query_response_interval, set_igmp_query_response_interval, "xsd:unsignedInt", 0, 1, UNDEF, NULL); + DMPARAM("LastMemberQueryInterval", ctx, "1", get_igmp_last_member_queryinterval, set_igmp_last_member_queryinterval, "xsd:unsignedInt", 0, 1, UNDEF, NULL); + DMPARAM("RobustnessValue", ctx, "1", get_igmp_robustness_value, set_igmp_robustness_value, "xsd:int", 0, 1, UNDEF, NULL); + DMPARAM("LanToLanMulticastEnable", ctx, "1", get_igmp_multicast_enable, set_igmp_multicast_enable, "xsd:boolean", 0, 1, UNDEF, NULL); + DMPARAM("MaxGroup", ctx, "1", get_igmp_maxgroup, set_igmp_maxgroup, "xsd:unsignedInt", 0, 1, UNDEF, NULL); + DMPARAM("MaxSources", ctx, "1", get_igmp_maxsources, set_igmp_maxsources, "xsd:unsignedInt", 0, 1, UNDEF, NULL); + DMPARAM("MaxMembers", ctx, "1", get_igmp_maxmembers, set_igmp_maxmembers, "xsd:unsignedInt", 0, 1, UNDEF, NULL); + DMPARAM("FastLeaveEnable", ctx, "1", get_igmp_fastleave_enable, set_igmp_fastleave_enable, "xsd:boolean", 0, 1, UNDEF, NULL); + DMPARAM("JoinImmediateEnable", ctx, "1", get_igmp_joinimmediate_enable, set_igmp_joinimmediate_enable, "xsd:boolean", 0, 1, UNDEF, NULL); + DMPARAM("ProxyEnable", ctx, "1", get_igmp_proxy_enable, set_igmp_proxy_enable, "xsd:boolean", 0, 1, UNDEF, NULL); + DMPARAM("SnoopingMode", ctx, "1", get_igmp_snooping_mode, set_igmp_snooping_mode, "", 0, 1, UNDEF, NULL); + DMPARAM("SnoopingInterfaces", ctx, "1", get_igmp_snooping_interface, set_igmp_snooping_interface, "", 0, 1, UNDEF, NULL); + return 0; + } + return FAULT_9005; +} diff --git a/dm/dmtree/x_inteno_se_igmp.h b/dm/dmtree/x_inteno_se_igmp.h new file mode 100644 index 0000000..d3f0a39 --- /dev/null +++ b/dm/dmtree/x_inteno_se_igmp.h @@ -0,0 +1,39 @@ +#ifndef __SE_IGMP_H +#define __SE_IGMP_H + +inline void compress_spaces(char *str); +int get_igmp_dscp_mark(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_dscp_mark(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_proxy_interface(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_proxy_interface(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_default_version(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_default_version(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_query_interval(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_query_interval(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_query_response_interval(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_query_response_interval(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_last_member_queryinterval(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_last_member_queryinterval(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_robustness_value(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_robustness_value(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_multicast_enable(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_multicast_enable(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_fastleave_enable(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_fastleave_enable(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_joinimmediate_enable(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_joinimmediate_enable(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_proxy_enable(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_proxy_enable(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_maxgroup(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_maxgroup(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_maxsources(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_maxsources(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_maxmembers(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_maxmembers(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_snooping_mode(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_snooping_mode(char *refparam, struct dmctx *ctx, int action, char *value); +int get_igmp_snooping_interface(char *refparam, struct dmctx *ctx, char **value); +int set_igmp_snooping_interface(char *refparam, struct dmctx *ctx, int action, char *value); +int entry_method_root_X_INTENO_SE_IGMP(struct dmctx *ctx); + +#endif \ No newline at end of file diff --git a/dm/dmtree/x_inteno_se_wifi.c b/dm/dmtree/x_inteno_se_wifi.c new file mode 100644 index 0000000..7927a2e --- /dev/null +++ b/dm/dmtree/x_inteno_se_wifi.c @@ -0,0 +1,92 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Copyright (C) 2015 Inteno Broadband Technology AB + * Author Imen Bhiri + * + */ + +#include +#include +#include +#include "dmuci.h" +#include "dmubus.h" +#include "dmcwmp.h" +#include "dmcommon.h" +#include "x_inteno_se_wifi.h" + +struct sewifiargs cur_wifiargs = {0}; + +inline int init_se_wifi(struct dmctx *ctx, struct uci_section *s) +{ + struct sewifiargs *args = &cur_wifiargs; + ctx->args = (void *)args; + args->sewifisection = s; + return 0; +} + +int get_wifi_frequency(char *refparam, struct dmctx *ctx, char **value) +{ + struct sewifiargs *wifiargs = (struct sewifiargs *)ctx->args; + char *lan_name = dmstrdup(section_name(wifiargs->sewifisection)); + + *value = dmstrdup("wlctl -i lan_name status |awk '$1==\"Chanspec:\" {print$2}'");//TODO + dmfree(lan_name); + return 0; +} + +int get_wifi_maxassoc(char *refparam, struct dmctx *ctx, char **value) +{ + struct sewifiargs *wifiargs = (struct sewifiargs *)ctx->args; + + dmuci_get_value_by_section_string(wifiargs->sewifisection, "maxassoc", value); + return 0; +} + +int set_wifi_maxassoc(char *refparam, struct dmctx *ctx, int action, char *value) +{ + bool b; + struct sewifiargs *wifiargs = (struct sewifiargs *)ctx->args; + + switch (action) { + VALUECHECK: + if (string_to_bool(value, &b)) + return FAULT_9007; + return 0; + VALUESET: + dmuci_set_value_by_section(wifiargs->sewifisection, "maxassoc", value); + // delay_service reload "network" "1" TODO + return 0; + } + return 0; +} + +int entry_method_root_SE_Wifi(struct dmctx *ctx) +{ + char *wnum; + struct uci_section *s = NULL; + + IF_MATCH(ctx, DMROOT"X_INTENO_SE_Wifi.") { + DMOBJECT(DMROOT"X_INTENO_SE_Wifi.", ctx, "0", 1, NULL, NULL, NULL); + DMOBJECT(DMROOT"X_INTENO_SE_Wifi.Radio.", ctx, "0", 1, NULL, NULL, NULL); + uci_foreach_sections("wireless", "wifi-device", s) { + if (s != NULL) { + init_se_wifi(ctx, s); + wnum = section_name(s); + wnum += 2; + dmasprintf(&wnum, "%d", atoi(wnum) + 1); + DMOBJECT(DMROOT"X_INTENO_SE_Wifi.Radio.%s.", ctx, "0", 1, NULL, NULL, NULL, wnum); + DMPARAM("Frequency", ctx, "0", get_wifi_frequency, NULL, "", 0, 1, UNDEF, NULL); + DMPARAM("MaxAssociations", ctx, "1", get_wifi_maxassoc, set_wifi_maxassoc, "", 0, 1, UNDEF, NULL); + dmfree(wnum); + } + else + break; + } + return 0; + } + return FAULT_9005; +} \ No newline at end of file diff --git a/dm/dmtree/x_inteno_se_wifi.h b/dm/dmtree/x_inteno_se_wifi.h new file mode 100644 index 0000000..922e1ab --- /dev/null +++ b/dm/dmtree/x_inteno_se_wifi.h @@ -0,0 +1,15 @@ +#ifndef __SE_WIFI_H +#define __SE_WIFI_H + +struct sewifiargs +{ + struct uci_section *sewifisection; +}; + +inline int init_se_wifi(struct dmctx *ctx, struct uci_section *s); +int get_wifi_frequency(char *refparam, struct dmctx *ctx, char **value); +int get_wifi_maxassoc(char *refparam, struct dmctx *ctx, char **value); +int set_wifi_maxassoc(char *refparam, struct dmctx *ctx, int action, char *value); +int entry_method_root_SE_Wifi(struct dmctx *ctx); + +#endif \ No newline at end of file