blob: a84b2cef7a9d3dfc39f3ff14692fd607ff6ccc3d [file] [log] [blame]
/*
* Copyright (c) 2020 DENX Software Engineering GmbH
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(net_dsa_sample, CONFIG_NET_DSA_LOG_LEVEL);
#include "dsa.h"
#if defined(CONFIG_NET_SAMPLE_DSA_LLDP)
#include "dsa_lldp.h"
#endif
struct ud user_data;
static void dsa_iface_find_cb(struct net_if *iface, void *user_data)
{
struct ud *ifaces = user_data;
if (net_if_l2(iface) != &NET_L2_GET_NAME(ETHERNET)) {
return;
}
if (net_eth_get_hw_capabilities(iface) & ETHERNET_DSA_CONDUIT_PORT) {
if (ifaces->conduit == NULL) {
ifaces->conduit = iface;
/* Get user interfaces */
for (int i = 0; i < ARRAY_SIZE(ifaces->lan); i++) {
#if defined(CONFIG_NET_DSA_DEPRECATED)
struct net_if *user = dsa_get_slave_port(iface, i);
#else
struct net_if *user = dsa_user_get_iface(iface, i);
#endif
if (user == NULL) {
continue;
}
LOG_INF("[%d] User interface %d found.", i,
net_if_get_by_iface(user));
ifaces->lan[i] = user;
}
return;
}
}
}
#if defined(CONFIG_NET_MGMT_EVENT)
#define EVENT_MASK (NET_EVENT_IF_UP)
static struct net_mgmt_event_callback mgmt_cb;
static void event_handler(struct net_mgmt_event_callback *cb,
uint64_t mgmt_event, struct net_if *iface)
{
ARG_UNUSED(iface);
ARG_UNUSED(cb);
if (mgmt_event == NET_EVENT_IF_UP) {
LOG_INF("Port %d is up", net_if_get_by_iface(iface));
#if defined(CONFIG_NET_DHCPV4)
net_dhcpv4_start(iface);
#endif
return;
}
}
#endif /* CONFIG_NET_MGMT_EVENT */
int main(void)
{
/* Initialize interfaces - read them to user_data */
(void)memset(&user_data, 0, sizeof(user_data));
net_if_foreach(dsa_iface_find_cb, &user_data);
#if defined(CONFIG_NET_MGMT_EVENT)
net_mgmt_init_event_callback(&mgmt_cb,
event_handler, EVENT_MASK);
net_mgmt_add_event_callback(&mgmt_cb);
#endif /* CONFIG_NET_MGMT_EVENT */
#if defined(CONFIG_NET_SAMPLE_DSA_LLDP)
dsa_lldp(&user_data);
#endif
LOG_INF("DSA ports init - OK");
return 0;
}