From 56420c854b55c2bb0e0c1420e91012bb40748b99 Mon Sep 17 00:00:00 2001 From: zhanglianghy Date: Fri, 9 Aug 2019 11:19:03 +0800 Subject: [PATCH 1/3] =?UTF-8?q?MOD=20aaa-12=20=E6=A1=A5=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=87=AA=E6=B5=8B=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3,?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A1=A5=E8=A7=84=E6=A0=BC=E5=88=A4=E6=96=AD?= =?UTF-8?q?=20SOL=20=20=E6=A1=A5=E6=8E=A5=E5=8F=A3=E8=87=AA=E6=B5=8B?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3,=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A1=A5=E8=A7=84=E6=A0=BC=E5=88=A4=E6=96=AD=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BA=BA=EF=BC=9Azhangliang=20=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E4=BA=BA=EF=BC=9Azhangliang?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Platform/common/rpc/rpc_common.h | 2 + .../configm/config-server/include/netconfig.h | 12 ++++ .../configm/config-server/include/parsefile.h | 2 +- .../config-server/netconfig/bridge/brconfig.c | 27 +++++++++ .../netconfig/bridge/include/libbridge.h | 3 + .../bridge/libbridge/libbridge_init.c | 39 +++++++++++-- .../config-server/netconfig/ifconfig.c | 56 +++++++++++++++++++ .../configm/config-server/netconfig/netmain.c | 6 +- .../config-server/netconfig/parsefile.c | 36 +++++------- 9 files changed, 154 insertions(+), 29 deletions(-) diff --git a/Platform/common/rpc/rpc_common.h b/Platform/common/rpc/rpc_common.h index 59e1dd365..d19b16aea 100755 --- a/Platform/common/rpc/rpc_common.h +++ b/Platform/common/rpc/rpc_common.h @@ -38,6 +38,7 @@ typedef enum { RET_IPINVALID = 13, RET_BR_INVALID = 14, RET_EXIST = 15, + RET_FULL = 16 } ret_code; #define RET_ERROR_DISC \ @@ -58,6 +59,7 @@ typedef enum { { RET_IPINVALID, "IpInvalid"},\ { RET_BR_INVALID, "BrNameInvalid"},\ { RET_EXIST, "AlreadyExist"}\ + { RET_FULL, "FULL"}\ } #define RET_BUFF_SIZE 256; diff --git a/Platform/user/configm/config-server/include/netconfig.h b/Platform/user/configm/config-server/include/netconfig.h index 727779e88..a069decb1 100644 --- a/Platform/user/configm/config-server/include/netconfig.h +++ b/Platform/user/configm/config-server/include/netconfig.h @@ -3,9 +3,21 @@ #include "ipconfig.h" #include "brconfig.h" +#define PORT_MAX_VLAN (10) + +/* 事件通知数据结构 */ +struct _net_ifnum { + int wan_num; + int lan_num; +}; +typedef struct _net_ifnum net_ifnum_t; + ret_code if_ioctl(unsigned long request, caddr_t ifreq, int *ret); ret_code if_set_up(char *ifname, int *code); ret_code if_set_down(char *ifname, int *code); +ret_code if_num_init(); +int if_lan_num(); +int if_wan_num(); ret_code net_main(); #endif diff --git a/Platform/user/configm/config-server/include/parsefile.h b/Platform/user/configm/config-server/include/parsefile.h index 9d1027650..99f44880b 100644 --- a/Platform/user/configm/config-server/include/parsefile.h +++ b/Platform/user/configm/config-server/include/parsefile.h @@ -21,7 +21,7 @@ void ip_conf_file_del(char *if_name, char *conf_buff); ret_code del_sub_string(char *str_in,char *str_sub); int if_read_dev_file(struct ifreq *ifcfg, int max_port); -ret_code if_conf_file_init(); int if_read_conf_file(struct ifreq *ifcfg, int max_port); +ret_code if_role_file_get(char *if_name, char *conf_buff); #endif diff --git a/Platform/user/configm/config-server/netconfig/bridge/brconfig.c b/Platform/user/configm/config-server/netconfig/bridge/brconfig.c index 96bbb9347..1083b5b03 100644 --- a/Platform/user/configm/config-server/netconfig/bridge/brconfig.c +++ b/Platform/user/configm/config-server/netconfig/bridge/brconfig.c @@ -19,6 +19,17 @@ /* 事件通知函数 */ br_event_head_t br_event_tbl = {.head.first = NULL, .lock = 0, .init = FALSE}; +int br_vlan_bridge(char *br_name) +{ + if(br_name[0] == 'b' && br_name[1] == 'r' + && br_name[2] == 'v' && br_name[3] == 'l') + { + return TRUE; + } + + return FALSE; +} + int br_invoke_event(BR_EVENT_TYPE event_type, br_event_t event_arg) { br_event_node_t *hnode; @@ -327,6 +338,18 @@ ret_code br_bridge_add(char *br_name, int *sys_err) br_event_t event_arg = {br_name, NULL}; int sys_ret = 0; + if(br_vlan_bridge(br_name)) + { + if(brvl_for_bridge_num() >= PORT_MAX_VLAN * if_lan_num()) + { + return RET_FULL; + } + } + else if(br_for_bridge_num() >= if_lan_num()) + { + return RET_FULL; + } + br_invoke_event(BR_CREATE_EVENT_PRE, event_arg); sys_ret = br_add_bridge(br_name); @@ -577,6 +600,10 @@ ret_code br_config_chk(uint source,uint *config_type, { case CM_CONFIG_ADD: case CM_CONFIG_DEL: + if(strcasecmp(br_name, "br0") == 0) + { + ret = RET_NOTSUPPORT; + } case CM_CONFIG_GET: ret = br_name_chk(br_name); break; diff --git a/Platform/user/configm/config-server/netconfig/bridge/include/libbridge.h b/Platform/user/configm/config-server/netconfig/bridge/include/libbridge.h index dda441603..428251fe2 100644 --- a/Platform/user/configm/config-server/netconfig/bridge/include/libbridge.h +++ b/Platform/user/configm/config-server/netconfig/bridge/include/libbridge.h @@ -120,4 +120,7 @@ extern int br_read_fdb(const char *br, struct fdb_entry *fdbs, extern int br_set_hairpin_mode(const char *bridge, const char *dev, int hairpin_mode); extern int br_for_port_num(const char *brname, int *cnt); +extern int br_for_bridge_num(); +extern int brvl_for_bridge_num(); + #endif diff --git a/Platform/user/configm/config-server/netconfig/bridge/libbridge/libbridge_init.c b/Platform/user/configm/config-server/netconfig/bridge/libbridge/libbridge_init.c index a1cf5d777..f3414341d 100644 --- a/Platform/user/configm/config-server/netconfig/bridge/libbridge/libbridge_init.c +++ b/Platform/user/configm/config-server/netconfig/bridge/libbridge/libbridge_init.c @@ -149,22 +149,51 @@ int br_foreach_bridge(int (*iterator)(const char *, void *), return ret; } + + + int brvl_cnt_num(const char *name, void *arg) + { + int *cnt = arg; + + if(name[0] == 'b' && name[1] == 'r' + && name[2] == 'v' && name[3] == 'l') + { + (*cnt)++; + } + + return 0; + } + + int brvl_for_bridge_num() + { + int cnt = 0; + + br_foreach_bridge(brvl_cnt_num, &cnt); + + return cnt; + } + int br_cnt_num(const char *name, void *arg) { int *cnt = arg; - (*cnt)++; + if(name[0] != 'b' || name[1] != 'r' + || name[2] != 'v' || name[3] != 'l') + { + (*cnt)++; + } return 0; } - int br_for_bridge_num(int *cnt) + int br_for_bridge_num() { - *cnt = 0; - br_foreach_bridge(br_cnt_num, cnt); + int cnt = 0; + + br_foreach_bridge(br_cnt_num, &cnt); - return 0; + return cnt; } /* diff --git a/Platform/user/configm/config-server/netconfig/ifconfig.c b/Platform/user/configm/config-server/netconfig/ifconfig.c index 8349d91d8..d7c2a39ae 100644 --- a/Platform/user/configm/config-server/netconfig/ifconfig.c +++ b/Platform/user/configm/config-server/netconfig/ifconfig.c @@ -14,6 +14,9 @@ #include "rpc.h" #include "netconfig.h" +#include "parsefile.h" + +net_ifnum_t g_if_num = {.wan_num = 2, .lan_num = 4}; /* call ioctl system call */ ret_code if_ioctl(unsigned long request, caddr_t ifreq, int *ret) @@ -104,4 +107,57 @@ ret_code if_set_down(char *ifname, int *code) return if_clear_flag(ifname, IFF_UP, code); } +int if_lan_num() +{ + return g_if_num.lan_num; +} + +int if_wan_num() +{ + return g_if_num.wan_num; +} + +ret_code if_num_init() +{ + char role_str[IF_BUFF_LEN] = {0}; + struct ifreq ifreq[MAX_IF_NUM]; + int if_count = 0; + int lan_count = 0; + int wan_count = 0; + int i; + + memset(&ifreq, 0, MAX_IF_NUM * sizeof(struct ifreq)); + + if_count = if_read_dev_file(ifreq, MAX_IF_NUM); + for(i = 0; i < if_count; i++) + { + memset(role_str, 0, IF_BUFF_LEN); + + if(if_role_file_get(ifreq[i].ifr_name, role_str) != RET_OK) + { + continue; + } + + if(strcasecmp(role_str, "lan")) + { + lan_count++; + } + else if(strcasecmp(role_str, "wan")) + { + wan_count++; + } + } + + if(lan_count != 0) + { + g_if_num.lan_num = lan_count; + } + + if(wan_count != 0) + { + g_if_num.wan_num = wan_count; + } + + return RET_OK; +} diff --git a/Platform/user/configm/config-server/netconfig/netmain.c b/Platform/user/configm/config-server/netconfig/netmain.c index fad21b18b..ce58f1b88 100644 --- a/Platform/user/configm/config-server/netconfig/netmain.c +++ b/Platform/user/configm/config-server/netconfig/netmain.c @@ -5,8 +5,10 @@ ret_code net_main() { - /* 初始化/etc/network/interfaces配置文件 */ - if_conf_file_init(); + br_bridge_init(); + + /* 初始化/etc/network/interfaces配置文件 */ + if_num_init(); } diff --git a/Platform/user/configm/config-server/netconfig/parsefile.c b/Platform/user/configm/config-server/netconfig/parsefile.c index a231d2aad..211736b92 100644 --- a/Platform/user/configm/config-server/netconfig/parsefile.c +++ b/Platform/user/configm/config-server/netconfig/parsefile.c @@ -868,33 +868,27 @@ void ip_conf_file_del(char *if_name, char *conf_buff) ret_code if_role_file_get(char *if_name, char *conf_buff) { char start_str[IF_BUFF_LEN] = {0}; - + char *p; + sprintf(start_str, "interface %s", if_name); if(conf_value_in_block_get(ETC_PRODUCT, start_str, - "interface", "role", conf_buff) == RET_NOTFOUND) + "interface", "role", conf_buff) == RET_OK) { - strcpy(conf_buff, "lan"); + p = conf_buff + strlen("role"); + + while(*p != '\0' && isspace(*p)) + { + p++; + } + if(*p != '\0') + { + strncpy(conf_buff, p, IF_BUFF_LEN); + return RET_OK; + } } - return RET_OK; -} - -ret_code if_conf_file_init() -{ - /*struct ifreq ifreq[MAX_IF_NUM]; - int if_count = 0; - int i; - - memset(&ifreq, 0, MAX_IF_NUM * sizeof(struct ifreq)); - - if_count = if_read_dev_file(ifreq, MAX_IF_NUM); - for(i = 0; i < if_count; i++) - { - if_conf_file_add(ifreq[i].ifr_name); - }*/ - - return RET_OK; + return RET_NOTFOUND; } From 17463489f922ffb2c638c3319aca598bf8d5c3fa Mon Sep 17 00:00:00 2001 From: zhanglianghy Date: Fri, 9 Aug 2019 11:30:35 +0800 Subject: [PATCH 2/3] =?UTF-8?q?MOD=20aaa-12=20=E6=A1=A5=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=87=AA=E6=B5=8B=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3,?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A1=A5=E8=A7=84=E6=A0=BC=E5=88=A4=E6=96=AD?= =?UTF-8?q?=20SOL=20=20=E6=A1=A5=E6=8E=A5=E5=8F=A3=E8=87=AA=E6=B5=8B?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3,=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A1=A5=E8=A7=84=E6=A0=BC=E5=88=A4=E6=96=AD=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BA=BA=EF=BC=9Azhangliang=20=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E4=BA=BA=EF=BC=9Azhangliang?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../netconfig/ipconfig/ipconfig.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Platform/user/configm/config-server/netconfig/ipconfig/ipconfig.c b/Platform/user/configm/config-server/netconfig/ipconfig/ipconfig.c index 468b9d25f..054354c84 100644 --- a/Platform/user/configm/config-server/netconfig/ipconfig/ipconfig.c +++ b/Platform/user/configm/config-server/netconfig/ipconfig/ipconfig.c @@ -333,16 +333,16 @@ ret_code if_get_prefix_all(pointer output, int *output_len, int *code) int mask_ret; int i; - memset(&ifc, 0, sizeof(struct ifconf)); - memset(&ifreq, 0, MAX_IF_NUM * sizeof(struct ifreq)); + memset(ifreq, 0, MAX_IF_NUM * sizeof(struct ifreq)); - ifc.ifc_len = MAX_IF_NUM * sizeof(struct ifreq); - ifc.ifc_buf = (char *)ifreq; - - if_count = if_read_dev_file(&ifreq, MAX_IF_NUM); + if_count = if_read_dev_file(ifreq, MAX_IF_NUM); if(if_count == 0) { + memset(&ifc, 0, sizeof(struct ifconf)); + ifc.ifc_len = MAX_IF_NUM * sizeof(struct ifreq); + ifc.ifc_buf = (char *)ifreq; + ret = if_ioctl(SIOCGIFCONF, (caddr_t)&ifc, code); ASSERT_RET(ret); @@ -354,16 +354,15 @@ ret_code if_get_prefix_all(pointer output, int *output_len, int *code) if((if_count * sizeof(ip_config_t) > CM_BUFF_SIZE) || (if_count == 0)) { - ret = RET_NOMEM; - ASSERT_RET(ret); + ret = RET_NOMEM; + ASSERT_RET(ret); } - ip_conf = rpc_new(ip_config_t, MAX_IF_NUM); + ip_conf = rpc_new0(ip_config_t, MAX_IF_NUM); if(ip_conf == NULL) { return RET_NOMEM; } - memset(ip_conf, 0, MAX_IF_NUM * sizeof(ip_config_t)); for(i = 0; i < if_count; i++) { From 12cdcdd39bb50dded484041c03d55da259f81218 Mon Sep 17 00:00:00 2001 From: zhanglianghy Date: Fri, 9 Aug 2019 14:40:45 +0800 Subject: [PATCH 3/3] =?UTF-8?q?MOD=20aaa-12=20=E6=A1=A5=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=87=AA=E6=B5=8B=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3,?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A1=A5=E8=A7=84=E6=A0=BC=E5=88=A4=E6=96=AD?= =?UTF-8?q?=20SOL=20=20=E6=A1=A5=E6=8E=A5=E5=8F=A3=E8=87=AA=E6=B5=8B?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3,=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A1=A5=E8=A7=84=E6=A0=BC=E5=88=A4=E6=96=AD=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BA=BA=EF=BC=9Azhangliang=20=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E4=BA=BA=EF=BC=9Azhangliang?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Platform/common/rpc/rpc_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Platform/common/rpc/rpc_common.h b/Platform/common/rpc/rpc_common.h index d19b16aea..bb636a5da 100755 --- a/Platform/common/rpc/rpc_common.h +++ b/Platform/common/rpc/rpc_common.h @@ -58,7 +58,7 @@ typedef enum { { RET_INPUTERR, "InputError"},\ { RET_IPINVALID, "IpInvalid"},\ { RET_BR_INVALID, "BrNameInvalid"},\ - { RET_EXIST, "AlreadyExist"}\ + { RET_EXIST, "AlreadyExist"},\ { RET_FULL, "FULL"}\ }