MOD aaa-12 桥接口自测问题解决,桥接口创建之后自动up
SOL 桥接口自测问题解决 修改人:zhangliang 检视人:zhangliang
This commit is contained in:
parent
5c71c16363
commit
445578d770
|
@ -3,9 +3,7 @@
|
|||
#include "ipconfig.h"
|
||||
#include "brconfig.h"
|
||||
|
||||
ret_code if_set_prefix(ip_config_t *ip_conf, int *code);
|
||||
ret_code if_get_prefix_all(pointer output, int *output_len, int *code);
|
||||
ret_code if_get_prefix(ip_config_t *ip_conf, int *code);
|
||||
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);
|
||||
|
|
@ -14,7 +14,6 @@
|
|||
#include <netdb.h>
|
||||
|
||||
#include "rpc.h"
|
||||
#include "ipconfig.h"
|
||||
|
||||
/* call ioctl system call */
|
||||
ret_code if_ioctl(unsigned long request, caddr_t ifreq, int *ret)
|
||||
|
@ -62,13 +61,13 @@ static int if_set_flag(char *ifname, short flag, int *code)
|
|||
|
||||
strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
|
||||
|
||||
ret = if_ioctl(SIOCGIFFLAGS, &ifr, code);
|
||||
ret = if_ioctl(SIOCGIFFLAGS, (caddr_t)&ifr, code);
|
||||
ASSERT_RET(ret);
|
||||
|
||||
strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
|
||||
ifr.ifr_flags |= flag;
|
||||
|
||||
ret = if_ioctl(SIOCSIFFLAGS, &ifr, code);
|
||||
ret = if_ioctl(SIOCSIFFLAGS, (caddr_t)&ifr, code);
|
||||
ASSERT_RET(ret);
|
||||
|
||||
return ret;
|
||||
|
@ -81,151 +80,20 @@ static int if_clear_flag(char *ifname, short flag, int *code)
|
|||
struct ifreq ifr = {0};
|
||||
ret_code ret;
|
||||
|
||||
safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
|
||||
strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
|
||||
|
||||
ret = if_ioctl(SIOCGIFFLAGS, &ifr, code);
|
||||
ret = if_ioctl(SIOCGIFFLAGS, (caddr_t)&ifr, code);
|
||||
ASSERT_RET(ret);
|
||||
|
||||
safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
|
||||
strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
|
||||
ifr.ifr_flags &= ~flag;
|
||||
|
||||
ret = if_ioctl(SIOCSIFFLAGS, &ifr)
|
||||
ret = if_ioctl(SIOCSIFFLAGS, (caddr_t)&ifr, code);
|
||||
ASSERT_RET(ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret_code if_set_prefix(ip_config_t *ip_conf, int *code)
|
||||
{
|
||||
ret_code ret;
|
||||
struct ifreq ifreq = {0};
|
||||
struct sockaddr_in addr;
|
||||
struct sockaddr_in mask;
|
||||
|
||||
strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name) - 1);
|
||||
addr.sin_addr = ip_conf->prefix;
|
||||
addr.sin_family = ip_conf->family;
|
||||
memcpy(&ifreq.ifr_addr, &addr, sizeof(struct sockaddr_in));
|
||||
|
||||
ret = if_ioctl(SIOCSIFADDR, (caddr_t)&ifreq, code);
|
||||
ASSERT_RET(ret);
|
||||
|
||||
if(ip_conf->prefix.s_addr != 0)
|
||||
{
|
||||
masklen2ip(ip_conf->prefixlen, &mask.sin_addr);
|
||||
mask.sin_family = ip_conf->family;
|
||||
memcpy(&ifreq.ifr_netmask, &mask, sizeof(struct sockaddr_in));
|
||||
|
||||
ret = if_ioctl(SIOCSIFNETMASK, (caddr_t)&ifreq, code);
|
||||
ASSERT_RET(ret);
|
||||
}
|
||||
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
ret_code if_get_prefix_all(pointer output, int *output_len, int *code)
|
||||
{
|
||||
struct ifreq ifreq[MAX_IF_NUM];
|
||||
struct sockaddr_in *addr;
|
||||
struct ifreq netmask;
|
||||
ip_config_t *ip_conf;
|
||||
struct ifconf ifc;
|
||||
int if_count = 0;
|
||||
ret_code ret;
|
||||
int mask_ret;
|
||||
int i;
|
||||
|
||||
memset(&ifc, 0, sizeof(struct ifconf));
|
||||
memset(&ifreq, 0, MAX_IF_NUM * sizeof(struct ifreq));
|
||||
|
||||
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 = ifc.ifc_len / (sizeof(struct ifreq));
|
||||
|
||||
rpc_log_info("if num is %d\n", if_count);
|
||||
|
||||
if((if_count * sizeof(ip_config_t) > CM_BUFF_SIZE)
|
||||
|| (if_count == 0))
|
||||
{
|
||||
ret = RET_NOMEM;
|
||||
ASSERT_RET(ret);
|
||||
}
|
||||
|
||||
ip_conf = rpc_new(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++)
|
||||
{
|
||||
rpc_log_info("get interface %s info\n", ifreq[i].ifr_name);
|
||||
strncpy(ip_conf[i].ifname, ifreq[i].ifr_name, INTERFACE_NAMSIZ - 1);
|
||||
ip_conf[i].family = AF_INET;
|
||||
ip_conf[i].prefix = ((struct sockaddr_in *)&(ifreq[i].ifr_addr))->sin_addr;
|
||||
|
||||
memset(&netmask, 0, sizeof(netmask));
|
||||
strncpy(netmask.ifr_name, ifreq[i].ifr_name, sizeof(netmask.ifr_name) - 1);
|
||||
|
||||
ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&netmask, &mask_ret);
|
||||
ASSERT_RET_NO(ret);
|
||||
|
||||
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);
|
||||
|
||||
rpc_free(ip_conf);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
ret_code if_get_prefix(ip_config_t *ip_conf, int *code)
|
||||
{
|
||||
struct sockaddr_in *addr;
|
||||
struct ifreq netmask;
|
||||
struct ifreq ifreq;
|
||||
ret_code ret = RET_OK;
|
||||
int mask_ret;
|
||||
int i;
|
||||
|
||||
if(ip_conf->family != AF_INET)
|
||||
{
|
||||
ret = RET_INPUTERR;
|
||||
}
|
||||
|
||||
ASSERT_RET(ret);
|
||||
|
||||
memset(&ifreq, 0, sizeof(struct ifreq));
|
||||
|
||||
rpc_log_info("get interface %s info\n", ip_conf->ifname);
|
||||
|
||||
strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name) - 1);
|
||||
|
||||
ret = if_ioctl(SIOCGIFADDR, (caddr_t)&ifreq, code);
|
||||
ASSERT_RET(ret);
|
||||
|
||||
|
||||
ip_conf->prefix = ((struct sockaddr_in *)&(ifreq.ifr_addr))->sin_addr;
|
||||
|
||||
memset(&ifreq, 0, sizeof(ifreq));
|
||||
strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name) - 1);
|
||||
|
||||
ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&ifreq, &mask_ret);
|
||||
ASSERT_RET_NO(ret);
|
||||
|
||||
addr = ( struct sockaddr_in * )&(ifreq.ifr_netmask);
|
||||
ip_conf->prefixlen = ip_masklen(addr->sin_addr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret_code if_set_up(char *ifname, int *code)
|
||||
{
|
||||
return if_set_flag(ifname, (IFF_UP | IFF_RUNNING), code);
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#include "configm.h"
|
||||
#include "ipconfig.h"
|
||||
#include "rpc.h"
|
||||
#include "parsefile.h"
|
||||
#include "netconfig.h"
|
||||
|
@ -62,7 +61,6 @@ void ip_save_file(ip_config_t *ip_conf, uint config_type)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
ret_code ip_config_json_parse(pointer input, uint *conf_type, ip_config_t *config_buff)
|
||||
{
|
||||
//ip_config_string_t *ip_config;
|
||||
|
@ -258,6 +256,138 @@ ret_code ip_config_format_json_array(int config_type, ip_config_t *config_buff,
|
|||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
ret_code if_set_prefix(ip_config_t *ip_conf, int *code)
|
||||
{
|
||||
ret_code ret;
|
||||
struct ifreq ifreq = {0};
|
||||
struct sockaddr_in addr;
|
||||
struct sockaddr_in mask;
|
||||
|
||||
strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name) - 1);
|
||||
addr.sin_addr = ip_conf->prefix;
|
||||
addr.sin_family = ip_conf->family;
|
||||
memcpy(&ifreq.ifr_addr, &addr, sizeof(struct sockaddr_in));
|
||||
|
||||
ret = if_ioctl(SIOCSIFADDR, (caddr_t)&ifreq, code);
|
||||
ASSERT_RET(ret);
|
||||
|
||||
if(ip_conf->prefix.s_addr != 0)
|
||||
{
|
||||
masklen2ip(ip_conf->prefixlen, &mask.sin_addr);
|
||||
mask.sin_family = ip_conf->family;
|
||||
memcpy(&ifreq.ifr_netmask, &mask, sizeof(struct sockaddr_in));
|
||||
|
||||
ret = if_ioctl(SIOCSIFNETMASK, (caddr_t)&ifreq, code);
|
||||
ASSERT_RET(ret);
|
||||
}
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
ret_code if_get_prefix(ip_config_t *ip_conf, int *code)
|
||||
{
|
||||
struct sockaddr_in *addr;
|
||||
struct ifreq netmask;
|
||||
struct ifreq ifreq;
|
||||
ret_code ret = RET_OK;
|
||||
int mask_ret;
|
||||
int i;
|
||||
|
||||
if(ip_conf->family != AF_INET)
|
||||
{
|
||||
ret = RET_INPUTERR;
|
||||
}
|
||||
|
||||
ASSERT_RET(ret);
|
||||
|
||||
memset(&ifreq, 0, sizeof(struct ifreq));
|
||||
|
||||
rpc_log_info("get interface %s info\n", ip_conf->ifname);
|
||||
|
||||
strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name) - 1);
|
||||
|
||||
ret = if_ioctl(SIOCGIFADDR, (caddr_t)&ifreq, code);
|
||||
ASSERT_RET(ret);
|
||||
|
||||
|
||||
ip_conf->prefix = ((struct sockaddr_in *)&(ifreq.ifr_addr))->sin_addr;
|
||||
|
||||
memset(&ifreq, 0, sizeof(ifreq));
|
||||
strncpy(ifreq.ifr_name, ip_conf->ifname, sizeof(ifreq.ifr_name) - 1);
|
||||
|
||||
ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&ifreq, &mask_ret);
|
||||
ASSERT_RET_NO(ret);
|
||||
|
||||
addr = ( struct sockaddr_in * )&(ifreq.ifr_netmask);
|
||||
ip_conf->prefixlen = ip_masklen(addr->sin_addr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret_code if_get_prefix_all(pointer output, int *output_len, int *code)
|
||||
{
|
||||
struct ifreq ifreq[MAX_IF_NUM];
|
||||
struct sockaddr_in *addr;
|
||||
struct ifreq netmask;
|
||||
ip_config_t *ip_conf;
|
||||
struct ifconf ifc;
|
||||
int if_count = 0;
|
||||
ret_code ret;
|
||||
int mask_ret;
|
||||
int i;
|
||||
|
||||
memset(&ifc, 0, sizeof(struct ifconf));
|
||||
memset(&ifreq, 0, MAX_IF_NUM * sizeof(struct ifreq));
|
||||
|
||||
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 = ifc.ifc_len / (sizeof(struct ifreq));
|
||||
|
||||
rpc_log_info("if num is %d\n", if_count);
|
||||
|
||||
if((if_count * sizeof(ip_config_t) > CM_BUFF_SIZE)
|
||||
|| (if_count == 0))
|
||||
{
|
||||
ret = RET_NOMEM;
|
||||
ASSERT_RET(ret);
|
||||
}
|
||||
|
||||
ip_conf = rpc_new(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++)
|
||||
{
|
||||
rpc_log_info("get interface %s info\n", ifreq[i].ifr_name);
|
||||
strncpy(ip_conf[i].ifname, ifreq[i].ifr_name, INTERFACE_NAMSIZ - 1);
|
||||
ip_conf[i].family = AF_INET;
|
||||
ip_conf[i].prefix = ((struct sockaddr_in *)&(ifreq[i].ifr_addr))->sin_addr;
|
||||
|
||||
memset(&netmask, 0, sizeof(netmask));
|
||||
strncpy(netmask.ifr_name, ifreq[i].ifr_name, sizeof(netmask.ifr_name) - 1);
|
||||
|
||||
ret = if_ioctl(SIOCGIFNETMASK, (caddr_t)&netmask, &mask_ret);
|
||||
ASSERT_RET_NO(ret);
|
||||
|
||||
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);
|
||||
|
||||
rpc_free(ip_conf);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
ret_code ip_config_set_chk(uint source,uint config_type,
|
||||
pointer input, int input_len,
|
||||
pointer output, int *output_len)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include "rpc.h"
|
||||
#include "netconfig.h"
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue