samples: net: vlan: Support all three network interfaces
The VLAN sample application only had configuration support for the Ethernet interface and one VLAN interface, and left the one VLAN interface unconfigured. Fix this by adding config support for all three network interfaces created by the sample. Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
This commit is contained in:
parent
90a58099f5
commit
a8135bbdd5
|
@ -5,31 +5,52 @@
|
|||
|
||||
mainmenu "Networking VLAN sample application"
|
||||
|
||||
config SAMPLE_VLAN_TAG
|
||||
int "Virtual lan tag used in VLAN sample app"
|
||||
default 100
|
||||
range 0 4094
|
||||
depends on NET_VLAN
|
||||
help
|
||||
Set virtual lan tag (id) that is used in VLAN sample application.
|
||||
|
||||
config SAMPLE_VLAN_TAG_2
|
||||
int "Second VLAN tag used in VLAN sample app"
|
||||
default 200
|
||||
range 0 4094
|
||||
depends on NET_VLAN
|
||||
help
|
||||
Set virtual lan tag (id) that is used in VLAN sample application.
|
||||
|
||||
config SAMPLE_IPV6_ADDR_2
|
||||
config NET_SAMPLE_IFACE2_MY_IPV6_ADDR
|
||||
string "My IPv6 address for second interface"
|
||||
help
|
||||
The value depends on your network setup.
|
||||
|
||||
config SAMPLE_IPV4_ADDR_2
|
||||
config NET_SAMPLE_IFACE2_MY_IPV4_ADDR
|
||||
string "My IPv4 address for second interface"
|
||||
help
|
||||
The value depends on your network setup.
|
||||
|
||||
config NET_SAMPLE_IFACE2_MY_IPV4_NETMASK
|
||||
string "My IPv4 netmask for second interface"
|
||||
help
|
||||
The value depends on your network setup.
|
||||
|
||||
config NET_SAMPLE_IFACE2_VLAN_TAG
|
||||
int "VLAN tag for second interface"
|
||||
default 100
|
||||
range 0 4094
|
||||
depends on NET_VLAN
|
||||
help
|
||||
Set VLAN (virtual LAN) tag (id) that is used in the sample
|
||||
application.
|
||||
|
||||
config NET_SAMPLE_IFACE3_MY_IPV6_ADDR
|
||||
string "My IPv6 address for third interface"
|
||||
help
|
||||
The value depends on your network setup.
|
||||
|
||||
config NET_SAMPLE_IFACE3_MY_IPV4_ADDR
|
||||
string "My IPv4 address for third interface"
|
||||
help
|
||||
The value depends on your network setup.
|
||||
|
||||
config NET_SAMPLE_IFACE3_MY_IPV4_NETMASK
|
||||
string "My IPv4 netmask for third interface"
|
||||
help
|
||||
The value depends on your network setup.
|
||||
|
||||
config NET_SAMPLE_IFACE3_VLAN_TAG
|
||||
int "VLAN tag for third interface"
|
||||
default 200
|
||||
range 0 4094
|
||||
depends on NET_VLAN
|
||||
help
|
||||
Set VLAN (virtual LAN) tag (id) that is used in the sample
|
||||
application.
|
||||
|
||||
source "Kconfig.zephyr"
|
||||
|
|
|
@ -19,7 +19,7 @@ CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=1
|
|||
CONFIG_NET_MAX_CONTEXTS=10
|
||||
|
||||
CONFIG_NET_IF_MAX_IPV6_COUNT=3
|
||||
CONFIG_NET_IF_MAX_IPV6_COUNT=3
|
||||
CONFIG_NET_IF_MAX_IPV4_COUNT=3
|
||||
|
||||
CONFIG_INIT_STACKS=y
|
||||
CONFIG_PRINTK=y
|
||||
|
@ -38,19 +38,25 @@ CONFIG_NET_CONFIG_PEER_IPV6_ADDR="2001:db8::2"
|
|||
CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
|
||||
CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.0.2.2"
|
||||
|
||||
# VLAN tag for the first interface
|
||||
CONFIG_SAMPLE_VLAN_TAG=100
|
||||
# Second VLAN supported network interface will have these settings
|
||||
CONFIG_NET_SAMPLE_IFACE2_MY_IPV6_ADDR="2001:db8:100::1"
|
||||
# TEST-NET-2 from RFC 5737
|
||||
CONFIG_NET_SAMPLE_IFACE2_MY_IPV4_ADDR="198.51.100.1"
|
||||
CONFIG_NET_SAMPLE_IFACE2_MY_IPV4_NETMASK="255.255.255.0"
|
||||
# VLAN tag for the second interface
|
||||
CONFIG_NET_SAMPLE_IFACE2_VLAN_TAG=100
|
||||
|
||||
# Settings for the second network interface
|
||||
CONFIG_SAMPLE_IPV6_ADDR_2="2001:db8:200::1"
|
||||
CONFIG_SAMPLE_VLAN_TAG_2=200
|
||||
# Settings for the third VLAN supported network interface
|
||||
CONFIG_NET_SAMPLE_IFACE3_MY_IPV6_ADDR="2001:db8:200::1"
|
||||
# TEST-NET-3 from RFC 5737
|
||||
CONFIG_SAMPLE_IPV4_ADDR_2="203.0.113.1"
|
||||
CONFIG_NET_SAMPLE_IFACE3_MY_IPV4_ADDR="203.0.113.1"
|
||||
CONFIG_NET_SAMPLE_IFACE3_MY_IPV4_NETMASK="255.255.255.0"
|
||||
# VLAN tag for the second interface
|
||||
CONFIG_NET_SAMPLE_IFACE3_VLAN_TAG=200
|
||||
|
||||
# Logging
|
||||
CONFIG_LOG=y
|
||||
|
||||
# VLAN settings. Note that currently SLIP only supports one VLAN tag,
|
||||
# and that is enforced by Kconfig file.
|
||||
# VLAN settings.
|
||||
CONFIG_NET_VLAN=y
|
||||
CONFIG_NET_VLAN_COUNT=2
|
||||
|
|
|
@ -36,12 +36,69 @@ static void iface_cb(struct net_if *iface, void *user_data)
|
|||
ud->second = iface;
|
||||
}
|
||||
|
||||
static int init_app(void)
|
||||
static int setup_iface(struct net_if *iface, struct net_if *vlan,
|
||||
const char *ipv6_addr, const char *ipv4_addr,
|
||||
const char *netmask, uint16_t vlan_tag)
|
||||
{
|
||||
struct net_if *iface;
|
||||
struct net_if_addr *ifaddr;
|
||||
struct in_addr addr4;
|
||||
struct in6_addr addr6;
|
||||
int ret;
|
||||
|
||||
ret = net_eth_vlan_enable(iface, vlan_tag);
|
||||
if (ret < 0) {
|
||||
LOG_ERR("Cannot enable VLAN for tag %d (%d)", vlan_tag, ret);
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_NET_IPV6)) {
|
||||
if (net_addr_pton(AF_INET6, ipv6_addr, &addr6)) {
|
||||
LOG_ERR("Invalid address: %s", ipv6_addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ifaddr = net_if_ipv6_addr_add(vlan, &addr6,
|
||||
NET_ADDR_MANUAL, 0);
|
||||
if (!ifaddr) {
|
||||
LOG_ERR("Cannot add %s to interface %p",
|
||||
ipv6_addr, vlan);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_NET_IPV4)) {
|
||||
if (net_addr_pton(AF_INET, ipv4_addr, &addr4)) {
|
||||
LOG_ERR("Invalid address: %s", ipv4_addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ifaddr = net_if_ipv4_addr_add(vlan, &addr4,
|
||||
NET_ADDR_MANUAL, 0);
|
||||
if (!ifaddr) {
|
||||
LOG_ERR("Cannot add %s to interface %p",
|
||||
ipv4_addr, vlan);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (netmask && netmask[0]) {
|
||||
struct in_addr nm;
|
||||
|
||||
if (net_addr_pton(AF_INET, netmask, &nm)) {
|
||||
LOG_ERR("Invalid netmask: %s", ipv4_addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
net_if_ipv4_set_netmask_by_addr(vlan, &addr4, &nm);
|
||||
}
|
||||
}
|
||||
|
||||
LOG_DBG("Interface %p VLAN tag %d setup done.", vlan, vlan_tag);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int init_app(void)
|
||||
{
|
||||
struct net_if *iface;
|
||||
struct ud ud;
|
||||
int ret;
|
||||
|
||||
|
@ -51,43 +108,31 @@ static int init_app(void)
|
|||
return -ENOENT;
|
||||
}
|
||||
|
||||
memset(&ud, 0, sizeof(ud));
|
||||
|
||||
net_if_foreach(iface_cb, &ud);
|
||||
|
||||
ret = net_eth_vlan_enable(iface, CONFIG_SAMPLE_VLAN_TAG);
|
||||
ret = setup_iface(iface, ud.first,
|
||||
CONFIG_NET_SAMPLE_IFACE2_MY_IPV6_ADDR,
|
||||
CONFIG_NET_SAMPLE_IFACE2_MY_IPV4_ADDR,
|
||||
CONFIG_NET_SAMPLE_IFACE2_MY_IPV4_NETMASK,
|
||||
CONFIG_NET_SAMPLE_IFACE2_VLAN_TAG);
|
||||
if (ret < 0) {
|
||||
LOG_ERR("Cannot enable VLAN for tag %d (%d)",
|
||||
CONFIG_SAMPLE_VLAN_TAG, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = net_eth_vlan_enable(iface, CONFIG_SAMPLE_VLAN_TAG_2);
|
||||
ret = setup_iface(iface, ud.second,
|
||||
CONFIG_NET_SAMPLE_IFACE3_MY_IPV6_ADDR,
|
||||
CONFIG_NET_SAMPLE_IFACE3_MY_IPV4_ADDR,
|
||||
CONFIG_NET_SAMPLE_IFACE3_MY_IPV4_NETMASK,
|
||||
CONFIG_NET_SAMPLE_IFACE3_VLAN_TAG);
|
||||
if (ret < 0) {
|
||||
LOG_ERR("Cannot enable VLAN for tag %d (%d)",
|
||||
CONFIG_SAMPLE_VLAN_TAG_2, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (net_addr_pton(AF_INET6, CONFIG_SAMPLE_IPV6_ADDR_2, &addr6)) {
|
||||
LOG_ERR("Invalid address: %s", CONFIG_SAMPLE_IPV6_ADDR_2);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ifaddr = net_if_ipv6_addr_add(ud.second, &addr6, NET_ADDR_MANUAL, 0);
|
||||
if (!ifaddr) {
|
||||
LOG_ERR("Cannot add %s to interface %p",
|
||||
CONFIG_SAMPLE_IPV6_ADDR_2, ud.second);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (net_addr_pton(AF_INET, CONFIG_SAMPLE_IPV4_ADDR_2, &addr4)) {
|
||||
LOG_ERR("Invalid address: %s", CONFIG_SAMPLE_IPV4_ADDR_2);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ifaddr = net_if_ipv4_addr_add(ud.second, &addr4, NET_ADDR_MANUAL, 0);
|
||||
if (!ifaddr) {
|
||||
LOG_ERR("Cannot add %s to interface %p",
|
||||
CONFIG_SAMPLE_IPV4_ADDR_2, ud.second);
|
||||
return -EINVAL;
|
||||
}
|
||||
/* Bring up the VLAN interface automatically */
|
||||
net_if_up(ud.first);
|
||||
net_if_up(ud.second);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue