samples: net: lldp: Fix the VLAN support

The lldp sample VLAN code needed updating so that correct
interfaces are in use.

Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
This commit is contained in:
Jukka Rissanen 2024-03-27 10:47:13 +02:00 committed by Fabio Baltieri
parent 793cd56678
commit d47386110b
2 changed files with 32 additions and 28 deletions

View file

@ -18,6 +18,8 @@ CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT=5
CONFIG_NET_IF_MCAST_IPV6_ADDR_COUNT=5
CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=1
CONFIG_NET_MAX_CONTEXTS=2
CONFIG_NET_IF_MAX_IPV6_COUNT=3
CONFIG_NET_IF_MAX_IPV4_COUNT=3
CONFIG_INIT_STACKS=y
CONFIG_PRINTK=y
@ -56,11 +58,9 @@ CONFIG_NET_SAMPLE_IFACE3_VLAN_TAG=200
# Logging
CONFIG_LOG=y
# VLAN settings. We will have three VLANs in this sample.
# The CONFIG_NET_VLAN_COUNT will also determine how many ethernet network
# interfaces there will be in the system.
# VLAN settings. We will have two VLANs in this sample.
CONFIG_NET_VLAN=y
CONFIG_NET_VLAN_COUNT=3
CONFIG_NET_VLAN_COUNT=2
# LLDP settings
CONFIG_NET_LLDP=y

View file

@ -36,14 +36,13 @@ static void set_optional_tlv(struct net_if *iface)
struct ud {
struct net_if *first;
struct net_if *second;
struct net_if *third;
};
static void iface_cb(struct net_if *iface, void *user_data)
{
struct ud *ud = user_data;
if (net_if_l2(iface) != &NET_L2_GET_NAME(ETHERNET)) {
if (net_if_l2(iface) != &NET_L2_GET_NAME(VIRTUAL)) {
return;
}
@ -56,22 +55,20 @@ static void iface_cb(struct net_if *iface, void *user_data)
ud->second = iface;
return;
}
if (!ud->third) {
ud->third = iface;
return;
}
}
static int setup_iface(struct net_if *iface, const char *ipv6_addr,
const char *ipv4_addr, uint16_t vlan_tag)
static int setup_iface(struct net_if *eth_iface,
struct net_if *iface,
const char *ipv6_addr,
const char *ipv4_addr,
uint16_t vlan_tag)
{
struct net_if_addr *ifaddr;
struct in_addr addr4;
struct in6_addr addr6;
int ret;
ret = net_eth_vlan_enable(iface, vlan_tag);
ret = net_eth_vlan_enable(eth_iface, vlan_tag);
if (ret < 0) {
LOG_ERR("Cannot enable VLAN for tag %d (%d)", vlan_tag, ret);
}
@ -105,7 +102,7 @@ static int setup_iface(struct net_if *iface, const char *ipv6_addr,
static struct ud ud;
static int init_vlan(void)
static int init_vlan(struct net_if *iface)
{
enum ethernet_hw_caps caps;
int ret;
@ -114,17 +111,13 @@ static int init_vlan(void)
net_if_foreach(iface_cb, &ud);
caps = net_eth_get_hw_capabilities(ud.first);
caps = net_eth_get_hw_capabilities(iface);
if (!(caps & ETHERNET_HW_VLAN)) {
LOG_DBG("Interface %p does not support %s", ud.first, "VLAN");
LOG_DBG("Interface %p does not support %s", iface, "VLAN");
return -ENOENT;
}
/* This sample has two VLANs. For the second one we need to manually
* create IP address for this test. But first the VLAN needs to be
* added to the interface so that IPv6 DAD can work properly.
*/
ret = setup_iface(ud.second,
ret = setup_iface(iface, ud.first,
CONFIG_NET_SAMPLE_IFACE2_MY_IPV6_ADDR,
CONFIG_NET_SAMPLE_IFACE2_MY_IPV4_ADDR,
CONFIG_NET_SAMPLE_IFACE2_VLAN_TAG);
@ -132,7 +125,7 @@ static int init_vlan(void)
return ret;
}
ret = setup_iface(ud.third,
ret = setup_iface(iface, ud.second,
CONFIG_NET_SAMPLE_IFACE3_MY_IPV6_ADDR,
CONFIG_NET_SAMPLE_IFACE3_MY_IPV4_ADDR,
CONFIG_NET_SAMPLE_IFACE3_VLAN_TAG);
@ -140,6 +133,10 @@ static int init_vlan(void)
return ret;
}
/* Bring up the VLAN interface automatically */
net_if_up(ud.first);
net_if_up(ud.second);
return 0;
}
@ -194,22 +191,29 @@ static enum net_verdict parse_lldp(struct net_if *iface, struct net_pkt *pkt)
static int init_app(void)
{
enum ethernet_hw_caps caps;
struct net_if *iface;
int ret;
ret = init_vlan();
iface = net_if_get_first_by_type(&NET_L2_GET_NAME(ETHERNET));
if (!iface) {
LOG_ERR("No ethernet interfaces found.");
return -ENOENT;
}
ret = init_vlan(iface);
if (ret < 0) {
LOG_WRN("Cannot setup VLAN (%d)", ret);
}
caps = net_eth_get_hw_capabilities(ud.first);
caps = net_eth_get_hw_capabilities(iface);
if (!(caps & ETHERNET_LLDP)) {
LOG_ERR("Interface %p does not support %s", ud.first, "LLDP");
LOG_ERR("Interface %p does not support %s", iface, "LLDP");
LOG_ERR("Cannot continue!");
return -ENOENT;
}
set_optional_tlv(ud.first);
net_lldp_register_callback(ud.first, parse_lldp);
set_optional_tlv(iface);
net_lldp_register_callback(iface, parse_lldp);
return 0;
}