Skip to content

Commit

Permalink
Simplify application configuration
Browse files Browse the repository at this point in the history
Moved initialization of mac addresses and lldp port name to stack.
  • Loading branch information
olbjo committed Feb 18, 2021
1 parent ce42bb0 commit f560cf6
Show file tree
Hide file tree
Showing 20 changed files with 179 additions and 221 deletions.
18 changes: 3 additions & 15 deletions include/pnet_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -1170,24 +1170,12 @@ typedef struct pnet_ethaddr
#define PNET_LLDP_PORT_ID_MAX_SIZE \
(PNET_STATION_NAME_MAX_SIZE + PNET_PORT_NAME_MAX_SIZE)

/**
* Network interface
*/
typedef struct pnet_netif
{
char if_name[PNET_INTERFACE_NAME_MAX_SIZE]; /**< Terminated string */
pnet_ethaddr_t eth_addr; /**< Interface MAC address */
} pnet_netif_t;

/**
* Physical Port Configuration
*/
typedef struct pnet_port_cfg
{
pnet_netif_t phy_port;
char port_name[PNET_PORT_NAME_MAX_SIZE]; /**< Terminated string */
uint16_t rtclass_2_status;
uint16_t rtclass_3_status;
const char * netif_name;
} pnet_port_cfg_t;

/**
Expand All @@ -1213,10 +1201,10 @@ typedef struct pnet_ip_cfg
*/
typedef struct pnet_if_cfg
{
pnet_netif_t main_port; /**< Main (DAP) network interface. */
const char * main_netif_name; /**< Main (DAP) network interface. */
pnet_ip_cfg_t ip_cfg; /**< IP Settings for main network interface */

pnet_port_cfg_t ports[PNET_MAX_PORT]; /**< Physical ports (DAP ports) */
pnet_port_cfg_t physical_ports[PNET_MAX_PORT];
} pnet_if_cfg_t;

/**
Expand Down
95 changes: 13 additions & 82 deletions sample_app/sampleapp_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ static void ip_to_string (pnal_ipaddr_t ip, char * outputstring)
(uint8_t) (ip & 0xFF));
}

void app_mac_to_string (pnal_ethaddr_t mac, char * outputstring)
void app_mac_to_string (pnet_ethaddr_t mac, char * outputstring)
{
snprintf (
outputstring,
Expand Down Expand Up @@ -1317,7 +1317,6 @@ void app_plug_dap (pnet_t * net, void * arg)

int app_pnet_cfg_init_default (pnet_cfg_t * stack_config)
{
uint16_t i;
memset (stack_config, 0, sizeof (pnet_cfg_t));
stack_config->tick_us = APP_TICK_INTERVAL_US;

Expand Down Expand Up @@ -1391,18 +1390,6 @@ int app_pnet_cfg_init_default (pnet_cfg_t * stack_config)
/* Timing */
stack_config->min_device_interval = 32; /* Corresponds to 1 ms */

/* LLDP settings */
for (i = 0; i < PNET_MAX_PORT; i++)
{
snprintf (
stack_config->if_cfg.ports[i].port_name,
sizeof (stack_config->if_cfg.ports[i].port_name),
"port-%03d",
i + 1);
stack_config->if_cfg.ports[i].rtclass_2_status = 0;
stack_config->if_cfg.ports[i].rtclass_3_status = 0;
}

/* Network configuration */
stack_config->send_hello = true;
stack_config->if_cfg.ip_cfg.dhcp_enable = false;
Expand All @@ -1415,50 +1402,6 @@ int app_pnet_cfg_init_default (pnet_cfg_t * stack_config)
return 0;
}

/**
* Initialize a network interface configuration from a network
* interface name.
* This includes reading the Ethernet MAC address.
* If the network interface can not be found or the operation
* fails to read the mac address from the network interface,
* error is returned.
* @param netif_name In: Network interface name
* @param p_netif Out: Network interface configuration
* @param verbosity In: Verbosity
* @return 0 on success
* -1 on error
*/
int app_port_cfg_init (
const char * netif_name,
pnet_netif_t * p_netif,
int verbosity)
{
pnal_ethaddr_t mac;
char mac_string[PNAL_ETH_ADDRSTR_SIZE]; /* Terminated string */

int ret = pnal_get_macaddress (netif_name, &mac);
if (ret != 0)
{
printf (
"Error: The given network interface does not exist: \"%s\"\n",
netif_name);
return -1;
}
else
{
if (verbosity > 0)
{
app_mac_to_string (mac, mac_string);
printf ("%-10s %s\n", netif_name, mac_string);
}
}

strncpy (p_netif->if_name, netif_name, PNET_INTERFACE_NAME_MAX_SIZE);
memcpy (p_netif->eth_addr.addr, mac.addr, sizeof (pnal_ethaddr_t));

return 0;
}

int app_get_netif_namelist (
const char * arg_str,
app_netif_namelist_t * p_if_list,
Expand Down Expand Up @@ -1528,6 +1471,7 @@ int app_get_netif_namelist (

int app_pnet_cfg_init_netifs (
const char * netif_list_str,
app_netif_namelist_t * if_list,
pnet_cfg_t * p_cfg,
int verbosity)
{
Expand All @@ -1536,48 +1480,35 @@ int app_pnet_cfg_init_netifs (
pnal_ipaddr_t ip;
pnal_ipaddr_t netmask;
pnal_ipaddr_t gateway;
app_netif_namelist_t if_list;

ret = app_get_netif_namelist (netif_list_str, &if_list, PNET_MAX_PORT);
ret = app_get_netif_namelist (netif_list_str, if_list, PNET_MAX_PORT);
if (ret != 0)
{
return ret;
}
p_cfg->if_cfg.main_netif_name = if_list->netif[0].name;

if (verbosity > 0)
{
printf ("Management port: ");
}
if (
app_port_cfg_init (
if_list.netif[0].name,
&p_cfg->if_cfg.main_port,
verbosity) != 0)
{
return -1;
printf ("Management port: %s\n", p_cfg->if_cfg.main_netif_name);
}

for (i = 1; i <= PNET_MAX_PORT; i++)
{
p_cfg->if_cfg.physical_ports[i - 1].netif_name = if_list->netif[i].name;
if (verbosity > 0)
{
printf ("Physical port [%u]: ", i);
}

if (
app_port_cfg_init (
if_list.netif[i].name,
&p_cfg->if_cfg.ports[i - 1].phy_port,
verbosity) != 0)
{
return -1;
printf (
"Physical port [%u]: %s\n",
i,
p_cfg->if_cfg.physical_ports[i - 1].netif_name);
}
}

/* Read IP, netmask, gateway from operating system */
ip = pnal_get_ip_address (if_list.netif[0].name);
netmask = pnal_get_netmask (if_list.netif[0].name);
gateway = pnal_get_gateway (if_list.netif[0].name);
ip = pnal_get_ip_address (p_cfg->if_cfg.main_netif_name);
netmask = pnal_get_netmask (p_cfg->if_cfg.main_netif_name);
gateway = pnal_get_gateway (p_cfg->if_cfg.main_netif_name);

if (verbosity > 0)
{
Expand Down
5 changes: 4 additions & 1 deletion sample_app/sampleapp_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ typedef struct app_data_obj
bool alarm_allowed;
pnet_alarm_argument_t alarm_arg;
struct cmd_args arguments;
app_netif_namelist_t if_list;
uint32_t app_param_1;
uint32_t app_param_2;
uint8_t inputdata[APP_DATASIZE_INPUT];
Expand Down Expand Up @@ -276,7 +277,7 @@ typedef enum app_demo_state
* @param outputstring Out: Resulting string buffer. Should have size
* PNAL_ETH_ADDRSTR_SIZE.
*/
void app_mac_to_string (pnal_ethaddr_t mac, char * outputstring);
void app_mac_to_string (pnet_ethaddr_t mac, char * outputstring);

/**
* Print out current IP address, netmask and default gateway.
Expand Down Expand Up @@ -306,13 +307,15 @@ int app_pnet_cfg_init_default (pnet_cfg_t * stack_config);
*
* @param netif_list_str In: Comma separated list of network interfaces.
* Terminated string.
* @param if_list Out: Network interface string storage.
* @param p_cfg InOut: p-net configuration
* @param verbosity In: Verbosity
* @return 0 on success
* -1 on error
*/
int app_pnet_cfg_init_netifs (
const char * netif_list_str,
app_netif_namelist_t * if_list,
pnet_cfg_t * p_cfg,
int verbosity);

Expand Down
6 changes: 3 additions & 3 deletions src/common/pf_dcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ static void pf_dcp_responder (pnet_t * net, void * arg, uint32_t current_time)
{
if (net->dcp_delayed_response_waiting == true)
{
if (pf_eth_send (net, net->eth_handle, p_buf) > 0)
if (pf_eth_send (net, net->pf_interface.main_port.handle, p_buf) > 0)
{
LOG_DEBUG (
PNET_LOG,
Expand Down Expand Up @@ -1091,7 +1091,7 @@ static int pf_dcp_get_set (
p_dst_dcphdr->data_length = htons (dst_pos - dst_start);
p_rsp->len = dst_pos;

if (pf_eth_send (net, net->eth_handle, p_rsp) > 0)
if (pf_eth_send (net, net->pf_interface.main_port.handle, p_rsp) > 0)
{
LOG_DEBUG (
PF_DCP_LOG,
Expand Down Expand Up @@ -1366,7 +1366,7 @@ int pf_dcp_hello_req (pnet_t * net)
p_dcphdr->data_length = htons (dst_pos - dst_start_pos);
p_buf->len = dst_pos;

(void)pf_eth_send (net, net->eth_handle, p_buf);
(void)pf_eth_send (net, net->pf_interface.main_port.handle, p_buf);
}
pnal_buf_free (p_buf);
}
Expand Down
92 changes: 66 additions & 26 deletions src/common/pf_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,65 @@
#ifdef UNIT_TEST
#define pnal_eth_init mock_pnal_eth_init
#define pnal_eth_send mock_pnal_eth_send
#define pnal_get_macaddress mock_pnal_get_macaddress
#endif

#include <string.h>
#include "pf_includes.h"

/**
* Init network interface.
* Set name, read mac address, register receive callback.
*
* @param net InOut: The p-net stack instance
* @param netif_name In: Network interface name
* @param eth_receive_type In: Ethernet frame types that shall be received
* by the network interface / port.
* @param netif Out: Initialized network interface.
* @return
*/
static int pf_eth_init_netif (
pnet_t * net,
const char * netif_name,
pnal_ethertype_t eth_receive_type,
pf_netif_t * netif)
{
pnal_ethaddr_t pnal_mac_addr;

snprintf (netif->name, sizeof (netif->name), "%s", netif_name);

netif->handle =
pnal_eth_init (netif->name, eth_receive_type, pf_eth_recv, (void *)net);

if (netif->handle == NULL)
{
LOG_ERROR (PNET_LOG, "Failed to init \"%s\"\n", netif_name);
return -1;
}

if (pnal_get_macaddress (netif_name, &pnal_mac_addr) != 0)
{
LOG_ERROR (PNET_LOG, "Failed read mac address on \"%s\"\n", netif_name);
return -1;
}

memcpy (
netif->mac_address.addr,
pnal_mac_addr.addr,
sizeof (netif->mac_address.addr));

return 0;
}

int pf_eth_init (pnet_t * net, const pnet_cfg_t * p_cfg)
{
int port;
pf_port_iterator_t port_iterator;
pf_port_t * p_port_data;
const pnet_port_cfg_t * p_port_cfg;
pnal_ethertype_t main_port_receive_type;
#if PNET_MAX_PORT > 1
const pnet_port_cfg_t * p_port_cfg;
#endif

memset (net->eth_id_map, 0, sizeof (net->eth_id_map));

Expand All @@ -49,17 +96,13 @@ int pf_eth_init (pnet_t * net, const pnet_cfg_t * p_cfg)
#endif

/* Init management port */
net->eth_handle = pnal_eth_init (
p_cfg->if_cfg.main_port.if_name,
main_port_receive_type,
pf_eth_recv,
(void *)net);
if (net->eth_handle == NULL)
if (
pf_eth_init_netif (
net,
p_cfg->if_cfg.main_netif_name,
main_port_receive_type,
&net->pf_interface.main_port) != 0)
{
LOG_ERROR (
PNET_LOG,
"Failed to init \"%s\"\n",
p_cfg->if_cfg.main_port.if_name);
return -1;
}

Expand All @@ -69,27 +112,24 @@ int pf_eth_init (pnet_t * net, const pnet_cfg_t * p_cfg)
while (port != 0)
{
p_port_data = pf_port_get_state (net, port);
p_port_cfg = pf_port_get_config (net, port);

#if PNET_MAX_PORT > 1
p_port_data->eth_handle = pnal_eth_init (
p_port_cfg->phy_port.if_name,
PNAL_ETHTYPE_LLDP,
pf_eth_recv,
(void *)net);
#else
/* In single port configuration managed port is also physical port 1 */
p_port_data->eth_handle = net->eth_handle;
#endif
p_port_cfg = pf_port_get_config (net, port);

if (p_port_data->eth_handle == NULL)
if (
pf_eth_init_netif (
net,
p_port_cfg->netif_name,
PNAL_ETHTYPE_LLDP,
&p_port_data->netif) != 0)
{
LOG_ERROR (
PNET_LOG,
"Failed to init \"%s\"\n",
p_port_cfg->phy_port.if_name);
return -1;
}
#else
/* In single port configuration the managed port is also physical port 1
*/
p_port_data->netif = net->pf_interface.main_port;
#endif

port = pf_port_get_next (&port_iterator);
}
Expand Down
Loading

0 comments on commit f560cf6

Please sign in to comment.