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:
Jukka Rissanen 2024-03-28 13:52:29 +02:00 committed by Maureen Helm
parent 90a58099f5
commit a8135bbdd5
3 changed files with 130 additions and 58 deletions

View File

@ -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"

View File

@ -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

View File

@ -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;
}