From dc059f961378f310fe74ba46fa80e11377cbd8e1 Mon Sep 17 00:00:00 2001 From: zhanglianghy Date: Wed, 7 Aug 2019 18:29:41 +0800 Subject: [PATCH] =?UTF-8?q?MOD=20aaa-12=20=E8=8E=B7=E5=8F=96=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E6=8E=A5=E5=8F=A3=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89ip=E4=B9=9F=E5=8F=AF=E4=BB=A5=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=88=B0=20SOL=20=20=E8=8E=B7=E5=8F=96=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E6=8E=A5=E5=8F=A3=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C?= =?UTF-8?q?=E6=B2=A1=E6=9C=89ip=E4=B9=9F=E5=8F=AF=E4=BB=A5=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=88=B0=20=E4=BF=AE=E6=94=B9=E4=BA=BA=EF=BC=9Azhangl?= =?UTF-8?q?iang=20=E6=A3=80=E8=A7=86=E4=BA=BA=EF=BC=9Azhangliang?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configm/config-server/include/netconfig.h | 3 + .../config-server/netconfig/ifconfig.c | 62 +++++++++++++++++++ .../netconfig/ipconfig/ipconfig.c | 25 ++++---- 3 files changed, 78 insertions(+), 12 deletions(-) diff --git a/Platform/user/configm/config-server/include/netconfig.h b/Platform/user/configm/config-server/include/netconfig.h index 727779e88..204c00622 100644 --- a/Platform/user/configm/config-server/include/netconfig.h +++ b/Platform/user/configm/config-server/include/netconfig.h @@ -3,9 +3,12 @@ #include "ipconfig.h" #include "brconfig.h" +#define PATH_PROCNET_DEV "/proc/net/dev" + 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); +int if_readlist(caddr_t ifcfg, int max_port); ret_code net_main(); #endif diff --git a/Platform/user/configm/config-server/netconfig/ifconfig.c b/Platform/user/configm/config-server/netconfig/ifconfig.c index d3efe34bb..ded4f4ca4 100644 --- a/Platform/user/configm/config-server/netconfig/ifconfig.c +++ b/Platform/user/configm/config-server/netconfig/ifconfig.c @@ -14,6 +14,35 @@ #include #include "rpc.h" +#include "netconfig.h" + +static char *if_parse_name(char *name, char *p) +{ + while (isspace(*p)) + p++; + while (*p) { + if (isspace(*p)) + break; + if (*p == ':') { /* could be an alias */ + char *dot = p, *dotname = name; + *name++ = *p++; + while (isdigit(*p)) + *name++ = *p++; + if (*p != ':') { /* it wasn't, backup */ + p = dot; + name = dotname; + } + if (*p == '\0') + return NULL; + p++; + break; + } + *name++ = *p++; + } + *name++ = '\0'; + return p; +} + /* call ioctl system call */ ret_code if_ioctl(unsigned long request, caddr_t ifreq, int *ret) @@ -104,3 +133,36 @@ ret_code if_set_down(char *ifname, int *code) return if_clear_flag(ifname, IFF_UP, code); } +int if_readlist(caddr_t ifcfg, int max_port) +{ + struct ifreq *ifreq = (struct ifreq *)ifcfg; + char name[128] = {0}; + char buf[512] = {0}; + int i = 0; + FILE *fh; + + fh = fopen(PATH_PROCNET_DEV, "r"); + if (!fh) { + return 0; + } + + fgets(buf, sizeof buf, fh); /* eat line */ + fgets(buf, sizeof buf, fh); + + while (fgets(buf, sizeof buf, fh)) { + if(i >= max_port){ + break; + } + + memset(name, 0, 128); + if_parse_name(name, buf); + if(strlen(name) != 0){ + strncpy(ifreq[i].ifr_name, name, sizeof(ifreq[i].ifr_name)); + i++; + } + } + + fclose(fh); + return i; +} + diff --git a/Platform/user/configm/config-server/netconfig/ipconfig/ipconfig.c b/Platform/user/configm/config-server/netconfig/ipconfig/ipconfig.c index e2ee3dbdd..8e3eab730 100644 --- a/Platform/user/configm/config-server/netconfig/ipconfig/ipconfig.c +++ b/Platform/user/configm/config-server/netconfig/ipconfig/ipconfig.c @@ -166,7 +166,7 @@ ret_code ip_config_json_parse_array(pointer input, uint *conf_type, } -ret_code ip_config_format_json(int config_type, ip_config_t *config_buff, +ret_code ip_config_format_json(ip_config_t *config_buff, pointer output, int *outlen) { ip_config_string_t tem_buff = {0}; @@ -174,7 +174,6 @@ ret_code ip_config_format_json(int config_type, ip_config_t *config_buff, //cJSON *json_obj = NULL; char *json_ip; - ip_config->config_type = config_type; ip_config->family = AF_INET; ip_config->prefixlen = config_buff->prefixlen; @@ -188,7 +187,6 @@ ret_code ip_config_format_json(int config_type, ip_config_t *config_buff, return RET_NOMEM; } - s2j_json_set_basic_element(json_obj, ip_config, int, config_type); s2j_json_set_basic_element(json_obj, ip_config, string, ifname); s2j_json_set_basic_element(json_obj, ip_config, int, family); s2j_json_set_basic_element(json_obj, ip_config, string, ipaddr); @@ -204,7 +202,7 @@ ret_code ip_config_format_json(int config_type, ip_config_t *config_buff, return RET_OK; } -ret_code ip_config_format_json_array(int config_type, ip_config_t *config_buff, +ret_code ip_config_format_json_array(ip_config_t *config_buff, int count, pointer output, int *outlen) { ip_config_string_t tem_buff = {0}; @@ -224,7 +222,6 @@ ret_code ip_config_format_json_array(int config_type, ip_config_t *config_buff, { memset(ip_config, 0, sizeof(ip_config_string_t)); - ip_config->config_type = config_type; ip_config->family = AF_INET; ip_config->prefixlen = config_buff[i].prefixlen; strncpy(ip_config->ifname, config_buff[i].ifname, INTERFACE_NAMSIZ - 1); @@ -239,7 +236,6 @@ ret_code ip_config_format_json_array(int config_type, ip_config_t *config_buff, cJSON_AddItemToArray(json_array, json_obj); - s2j_json_set_basic_element(json_obj, ip_config, int, config_type); s2j_json_set_basic_element(json_obj, ip_config, string, ifname); s2j_json_set_basic_element(json_obj, ip_config, int, family); s2j_json_set_basic_element(json_obj, ip_config, string, ipaddr); @@ -343,10 +339,15 @@ ret_code if_get_prefix_all(pointer output, int *output_len, int *code) 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); + if_count = if_readlist((caddr_t)&ifreq, MAX_IF_NUM); + + if(if_count == 0) + { + ret = if_ioctl(SIOCGIFCONF, (caddr_t)&ifc, code); + ASSERT_RET(ret); - if_count = ifc.ifc_len / (sizeof(struct ifreq)); + if_count = ifc.ifc_len / (sizeof(struct ifreq)); + } rpc_log_info("if num is %d\n", if_count); @@ -377,11 +378,11 @@ ret_code if_get_prefix_all(pointer output, int *output_len, int *code) ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&netmask, &mask_ret); ASSERT_RET_NO(ret); - addr = ( struct sockaddr_in * )&(netmask.ifr_netmask ); + addr = ( struct sockaddr_in * )&(netmask.ifr_netmask); ip_conf[i].prefixlen = ip_masklen(addr->sin_addr); } - ip_config_format_json_array(CM_CONFIG_GET, ip_conf, if_count, output, output_len); + ip_config_format_json_array(ip_conf, if_count, output, output_len); rpc_free(ip_conf); return RET_OK; @@ -553,7 +554,7 @@ ret_code ip_config_get(uint source, RET_ERR_FORMART(ret, code, output, *output_len); ASSERT_RET(ret); - ip_config_format_json(CM_CONFIG_GET, ip_conf, output, output_len); + ip_config_format_json(ip_conf, output, output_len); return ret; }