mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-10-14 22:56:25 +08:00
rc_conf: Add support for ifconfig_<interface>_alias[0-9]+.
The interface alias allows extra IP addresses to be set on and interface and it also allows the MAC address to be set. Examples: ifconfig_em0="inet 10.10.5.33 netmask 255.255.255.0" ifconfig_em0_alias0="ether 10:22:33:44:55:66" ifconfig_em0_alias1="inet 10.1.1.111 netmask 0xffffffff"
This commit is contained in:
@@ -220,10 +220,23 @@ load_create_args(rtems_bsd_rc_conf* rc_conf, rtems_bsd_rc_conf_argc_argv* aa)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ifconfig_show
|
||||||
|
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
ifconfig_show(const char* ifname)
|
||||||
|
{
|
||||||
|
const char const* ifconfig_show[] = { "ifconfig", ifname, NULL };
|
||||||
|
return rtems_bsd_command_ifconfig(2, (char**) ifconfig_show);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ifconfig_'interface'
|
* ifconfig_'interface'
|
||||||
*
|
*
|
||||||
* eg ifconfig_em0="inet 10.10.5.33 netmask 255.255.255.0"
|
* eg ifconfig_em0="inet 10.10.5.33 netmask 255.255.255.0"
|
||||||
|
* ifconfig_em0_alias0="ether 10:22:33:44:55:66"
|
||||||
|
* ifconfig_em0_alias1="inet 10.1.1.111 netmask 0xffffffff"
|
||||||
*
|
*
|
||||||
* See 'man rc.conf(5)' on FreeBSD.
|
* See 'man rc.conf(5)' on FreeBSD.
|
||||||
*/
|
*/
|
||||||
@@ -231,21 +244,22 @@ static int
|
|||||||
ifconfig_(rtems_bsd_rc_conf* rc_conf,
|
ifconfig_(rtems_bsd_rc_conf* rc_conf,
|
||||||
const char* ifname,
|
const char* ifname,
|
||||||
int argc,
|
int argc,
|
||||||
const char** argv)
|
const char** argv,
|
||||||
|
int opt_argc,
|
||||||
|
const char** opt_argv,
|
||||||
|
bool add_up)
|
||||||
{
|
{
|
||||||
const char** args;
|
const char** args;
|
||||||
int arg;
|
int arg;
|
||||||
int ifconfig_argc = 0;
|
int ifconfig_argc = 0;
|
||||||
bool add_up = true;
|
|
||||||
int r;
|
int r;
|
||||||
const char const* ifconfig_show[] = { "ifconfig", ifname, NULL };
|
|
||||||
|
|
||||||
for (arg = 1; arg < argc; ++arg) {
|
for (arg = 1; arg < argc; ++arg) {
|
||||||
if (strcasecmp(argv[arg], "NOAUTO") == 0)
|
if (strcasecmp(argv[arg], "NOAUTO") == 0)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
args = calloc(argc + 3, sizeof(char*));
|
args = calloc(argc + opt_argc + 3, sizeof(char*));
|
||||||
if (args == NULL) {
|
if (args == NULL) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
@@ -256,7 +270,8 @@ ifconfig_(rtems_bsd_rc_conf* rc_conf,
|
|||||||
|
|
||||||
for (arg = 1; arg < argc; ++arg) {
|
for (arg = 1; arg < argc; ++arg) {
|
||||||
if (strcasecmp("DHCP", argv[arg]) == 0 ||
|
if (strcasecmp("DHCP", argv[arg]) == 0 ||
|
||||||
strcasecmp("SYNCDHCP", argv[arg]) == 0) {
|
strcasecmp("SYNCDHCP", argv[arg]) == 0 ||
|
||||||
|
strcasecmp("UP", argv[arg]) == 0) {
|
||||||
add_up = false;
|
add_up = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -264,6 +279,12 @@ ifconfig_(rtems_bsd_rc_conf* rc_conf,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opt_argv != NULL) {
|
||||||
|
for (arg = 0; arg < opt_argc; ++arg) {
|
||||||
|
args[ifconfig_argc++] = opt_argv[arg];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (add_up)
|
if (add_up)
|
||||||
args[ifconfig_argc++] = "up";
|
args[ifconfig_argc++] = "up";
|
||||||
|
|
||||||
@@ -278,8 +299,6 @@ ifconfig_(rtems_bsd_rc_conf* rc_conf,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = rtems_bsd_command_ifconfig(2, (char**) ifconfig_show);
|
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,7 +372,7 @@ defaultrouter(rtems_bsd_rc_conf* rc_conf, rtems_bsd_rc_conf_argc_argv* aa)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
show_interfaces(const char* msg, struct ifaddrs* ifap)
|
list_interfaces(const char* msg, struct ifaddrs* ifap)
|
||||||
{
|
{
|
||||||
struct ifaddrs* ifa;
|
struct ifaddrs* ifa;
|
||||||
|
|
||||||
@@ -381,6 +400,18 @@ show_interfaces(const char* msg, struct ifaddrs* ifap)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
show_interfaces(struct ifaddrs* ifap)
|
||||||
|
{
|
||||||
|
struct ifaddrs* ifa;
|
||||||
|
|
||||||
|
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
|
||||||
|
ifconfig_show(ifa->ifa_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dhcp_check(rtems_bsd_rc_conf_argc_argv* aa)
|
dhcp_check(rtems_bsd_rc_conf_argc_argv* aa)
|
||||||
{
|
{
|
||||||
@@ -403,7 +434,11 @@ setup_lo0(rtems_bsd_rc_conf* rc_conf, struct ifaddrs* ifap)
|
|||||||
const char* lo0_argv[] = {
|
const char* lo0_argv[] = {
|
||||||
"ifconfig_lo0", "inet", "127.0.0.1", "netmask", "255.0.0.0", NULL
|
"ifconfig_lo0", "inet", "127.0.0.1", "netmask", "255.0.0.0", NULL
|
||||||
};
|
};
|
||||||
show_result("lo0", ifconfig_(rc_conf, "lo0", 5, lo0_argv));
|
show_result("lo0",
|
||||||
|
ifconfig_(rc_conf, "lo0",
|
||||||
|
5, lo0_argv,
|
||||||
|
0, NULL,
|
||||||
|
true));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -435,7 +470,23 @@ setup_interfaces(rtems_bsd_rc_conf* rc_conf,
|
|||||||
* A DHCP ifconfig can have other options we need to set on the
|
* A DHCP ifconfig can have other options we need to set on the
|
||||||
* interface.
|
* interface.
|
||||||
*/
|
*/
|
||||||
show_result(iface, ifconfig_(rc_conf, ifa->ifa_name, aa->argc, aa->argv));
|
show_result(iface, ifconfig_(rc_conf, ifa->ifa_name,
|
||||||
|
aa->argc, aa->argv,
|
||||||
|
0, NULL,
|
||||||
|
true));
|
||||||
|
}
|
||||||
|
snprintf(iface, sizeof(iface), "ifconfig_%s_alias[0-9]+", ifa->ifa_name);
|
||||||
|
if (r == 0) {
|
||||||
|
r = rtems_bsd_rc_conf_find(rc_conf, iface, aa);
|
||||||
|
while (r == 0) {
|
||||||
|
const char* alias_argv[] = { "alias", NULL };
|
||||||
|
show_result(iface,
|
||||||
|
ifconfig_(rc_conf, ifa->ifa_name,
|
||||||
|
aa->argc, aa->argv,
|
||||||
|
1, alias_argv,
|
||||||
|
false));
|
||||||
|
r = rtems_bsd_rc_conf_find_next(rc_conf, aa);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -493,8 +544,11 @@ setup_vlans(rtems_bsd_rc_conf* rc_conf,
|
|||||||
*dhcp = true;
|
*dhcp = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
show_result(vlan_name, ifconfig_(rc_conf, vlan_name,
|
show_result(vlan_name,
|
||||||
vaa->argc, vaa->argv));
|
ifconfig_(rc_conf, vlan_name,
|
||||||
|
vaa->argc, vaa->argv,
|
||||||
|
0, NULL,
|
||||||
|
true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -699,12 +753,13 @@ interfaces(rtems_bsd_rc_conf* rc_conf, rtems_bsd_rc_conf_argc_argv* aa)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
show_interfaces("Starting network: ", ifap);
|
list_interfaces("Starting network: ", ifap);
|
||||||
show_result("cloned_interfaces", cloned_interfaces(rc_conf, aa));
|
show_result("cloned_interfaces", cloned_interfaces(rc_conf, aa));
|
||||||
show_result("lo0", setup_lo0(rc_conf, ifap));
|
show_result("lo0", setup_lo0(rc_conf, ifap));
|
||||||
show_result("ifaces", setup_interfaces(rc_conf, aa, ifap, &dhcp));
|
show_result("ifaces", setup_interfaces(rc_conf, aa, ifap, &dhcp));
|
||||||
show_result("vlans", setup_vlans(rc_conf, aa, ifap, &dhcp));
|
show_result("vlans", setup_vlans(rc_conf, aa, ifap, &dhcp));
|
||||||
show_result("defaultrouter", defaultrouter(rc_conf, aa));
|
show_result("defaultrouter", defaultrouter(rc_conf, aa));
|
||||||
|
show_interfaces(ifap);
|
||||||
if (dhcp)
|
if (dhcp)
|
||||||
show_result("dhcp", run_dhcp(rc_conf, aa));
|
show_result("dhcp", run_dhcp(rc_conf, aa));
|
||||||
|
|
||||||
|
@@ -69,6 +69,12 @@ test_service(rtems_bsd_rc_conf* rc_conf)
|
|||||||
|
|
||||||
test_service_last_num = 1;
|
test_service_last_num = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fill match of anything.
|
||||||
|
*/
|
||||||
|
puts("test_service regex: 'test_regex_.*'");
|
||||||
|
test_regex_last_num = 0;
|
||||||
|
|
||||||
assert((aa = rtems_bsd_rc_conf_argc_argv_create()) != NULL);
|
assert((aa = rtems_bsd_rc_conf_argc_argv_create()) != NULL);
|
||||||
r = rtems_bsd_rc_conf_find(rc_conf, "test_regex_.*", aa);
|
r = rtems_bsd_rc_conf_find(rc_conf, "test_regex_.*", aa);
|
||||||
assert(r == 0 || (r < 0 && errno == ENOENT));
|
assert(r == 0 || (r < 0 && errno == ENOENT));
|
||||||
@@ -78,7 +84,7 @@ test_service(rtems_bsd_rc_conf* rc_conf)
|
|||||||
while (r == 0) {
|
while (r == 0) {
|
||||||
int num;
|
int num;
|
||||||
int arg;
|
int arg;
|
||||||
rtems_bsd_rc_conf_print_cmd(rc_conf, "test_service", aa->argc, aa->argv);
|
rtems_bsd_rc_conf_print_cmd(rc_conf, "test_service[1]", aa->argc, aa->argv);
|
||||||
assert(strncasecmp(aa->argv[0], "test_regex_", strlen("test_regex_")) == 0);
|
assert(strncasecmp(aa->argv[0], "test_regex_", strlen("test_regex_")) == 0);
|
||||||
num = atoi(aa->argv[0] + strlen("test_regex_"));
|
num = atoi(aa->argv[0] + strlen("test_regex_"));
|
||||||
assert(num == (test_regex_last_num + 1));
|
assert(num == (test_regex_last_num + 1));
|
||||||
@@ -98,6 +104,43 @@ test_service(rtems_bsd_rc_conf* rc_conf)
|
|||||||
r = rtems_bsd_rc_conf_find_next(rc_conf, aa);
|
r = rtems_bsd_rc_conf_find_next(rc_conf, aa);
|
||||||
assert(r == 0 || (r < 0 && errno == ENOENT));
|
assert(r == 0 || (r < 0 && errno == ENOENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Specific match of only numbers.
|
||||||
|
*/
|
||||||
|
puts("test_service regex: 'test_regex_[0-9]+'");
|
||||||
|
test_regex_last_num = 0;
|
||||||
|
|
||||||
|
assert((aa = rtems_bsd_rc_conf_argc_argv_create()) != NULL);
|
||||||
|
r = rtems_bsd_rc_conf_find(rc_conf, "test_regex_[0-9]+", aa);
|
||||||
|
assert(r == 0 || (r < 0 && errno == ENOENT));
|
||||||
|
if (r < 0 && errno == ENOENT)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
while (r == 0) {
|
||||||
|
int num;
|
||||||
|
int arg;
|
||||||
|
rtems_bsd_rc_conf_print_cmd(rc_conf, "test_service[2]", aa->argc, aa->argv);
|
||||||
|
assert(strncasecmp(aa->argv[0], "test_regex_", strlen("test_regex_")) == 0);
|
||||||
|
num = atoi(aa->argv[0] + strlen("test_regex_"));
|
||||||
|
assert(num == (test_regex_last_num + 1));
|
||||||
|
assert((num - 1) < NUM_OF_TEST_REGEX_);
|
||||||
|
for (arg = 0; arg < aa->argc; ++arg) {
|
||||||
|
const char* a = aa->argv[arg];
|
||||||
|
size_t l = strlen(a);
|
||||||
|
if (l > 0) {
|
||||||
|
assert(!isspace(a[0]));
|
||||||
|
assert(!isspace(a[l - 1]));
|
||||||
|
assert(a[0] != '"');
|
||||||
|
assert(a[l - 1] != '"');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
test_regex_results[num - 1] = true;
|
||||||
|
++test_regex_last_num;
|
||||||
|
r = rtems_bsd_rc_conf_find_next(rc_conf, aa);
|
||||||
|
assert(r == 0 || (r < 0 && errno == ENOENT));
|
||||||
|
}
|
||||||
|
|
||||||
rtems_bsd_rc_conf_argc_argv_destroy(aa);
|
rtems_bsd_rc_conf_argc_argv_destroy(aa);
|
||||||
puts("test_service done");
|
puts("test_service done");
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -75,8 +75,11 @@
|
|||||||
#define IFACE_IPV4(iface) \
|
#define IFACE_IPV4(iface) \
|
||||||
"ifconfig_" # iface "=\"inet " NET_CFG_SELF_IP " netmask " NET_CFG_NETMASK "\"\n"
|
"ifconfig_" # iface "=\"inet " NET_CFG_SELF_IP " netmask " NET_CFG_NETMASK "\"\n"
|
||||||
|
|
||||||
|
#define IFACE_ALIAS(iface) \
|
||||||
|
"ifconfig_" # iface "_alias0=\"ether 10:22:33:44:55:66\"\n" \
|
||||||
|
"ifconfig_" # iface "_alias1=\"inet 10.1.1.111 netmask 0xffffffff\"\n"
|
||||||
|
|
||||||
#define RC_CONF_IFACES \
|
#define RC_CONF_IFACES_IPV4 \
|
||||||
IFACE_IPV4(dmc0) \
|
IFACE_IPV4(dmc0) \
|
||||||
IFACE_IPV4(sm0) \
|
IFACE_IPV4(sm0) \
|
||||||
IFACE_IPV4(cgem0) \
|
IFACE_IPV4(cgem0) \
|
||||||
@@ -84,6 +87,18 @@
|
|||||||
IFACE_IPV4(em0) \
|
IFACE_IPV4(em0) \
|
||||||
IFACE_IPV4(re0)
|
IFACE_IPV4(re0)
|
||||||
|
|
||||||
|
#define RC_CONF_IFACES_ALIAS \
|
||||||
|
IFACE_ALIAS(dmc0) \
|
||||||
|
IFACE_ALIAS(sm0) \
|
||||||
|
IFACE_ALIAS(cgem0) \
|
||||||
|
IFACE_ALIAS(fec0) \
|
||||||
|
IFACE_ALIAS(em0) \
|
||||||
|
IFACE_ALIAS(re0)
|
||||||
|
|
||||||
|
#define RC_CONF_IFACES \
|
||||||
|
RC_CONF_IFACES_IPV4 \
|
||||||
|
RC_CONF_IFACES_ALIAS
|
||||||
|
|
||||||
#define IFACE_VLAN(iface) \
|
#define IFACE_VLAN(iface) \
|
||||||
"vlans_" # iface "=\"101 102\"\n" \
|
"vlans_" # iface "=\"101 102\"\n" \
|
||||||
"ifconfig_" # iface "_101=\"inet 192.0.101.1/24\"\n" \
|
"ifconfig_" # iface "_101=\"inet 192.0.101.1/24\"\n" \
|
||||||
|
Reference in New Issue
Block a user