Skip to content
Permalink
Browse files

net: ptp: Add usermode support to net_eth_get_ptp_clock_by_index()

Make net_eth_get_ptp_clock_by_index() clock API to work with user space.
Create also unit test for testing this user mode support.

Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
  • Loading branch information...
jukkar committed May 27, 2019
1 parent 11b06fa commit 95e8498c277ba40fb3f2887021ff2ced4c57f239
Showing with 77 additions and 14 deletions.
  1. +4 −10 include/net/ethernet.h
  2. +18 −2 subsys/net/l2/ethernet/ethernet.c
  3. +2 −0 tests/net/ptp/clock/prj.conf
  4. +53 −2 tests/net/ptp/clock/src/main.c
@@ -13,6 +13,7 @@
#ifndef ZEPHYR_INCLUDE_NET_ETHERNET_H_
#define ZEPHYR_INCLUDE_NET_ETHERNET_H_

#include <kernel.h>
#include <zephyr/types.h>
#include <stdbool.h>
#include <atomic.h>
@@ -691,16 +692,7 @@ static inline struct device *net_eth_get_ptp_clock(struct net_if *iface)
* @return Pointer to PTP clock if found, NULL if not found or if this
* ethernet interface index does not support PTP.
*/
#if defined(CONFIG_PTP_CLOCK)
struct device *net_eth_get_ptp_clock_by_index(int index);
#else
static inline struct device *net_eth_get_ptp_clock_by_index(int index)
{
ARG_UNUSED(index);

return NULL;
}
#endif
__syscall struct device *net_eth_get_ptp_clock_by_index(int index);

/**
* @brief Return gPTP port number attached to this interface.
@@ -730,6 +722,8 @@ static inline int net_eth_get_ptp_port(struct net_if *iface)
void net_eth_set_ptp_port(struct net_if *iface, int port);
#endif /* CONFIG_NET_GPTP */

#include <syscalls/ethernet.h>

#ifdef __cplusplus
}
#endif
@@ -19,6 +19,8 @@ LOG_MODULE_REGISTER(net_ethernet, CONFIG_NET_L2_ETHERNET_LOG_LEVEL);
#include <net/lldp.h>
#endif

#include <syscall_handler.h>

#include "arp.h"
#include "eth_stats.h"
#include "net_private.h"
@@ -988,7 +990,7 @@ struct device *net_eth_get_ptp_clock(struct net_if *iface)
#endif /* CONFIG_PTP_CLOCK */

#if defined(CONFIG_PTP_CLOCK)
struct device *net_eth_get_ptp_clock_by_index(int index)
struct device *z_impl_net_eth_get_ptp_clock_by_index(int index)
{
struct net_if *iface;

@@ -999,7 +1001,21 @@ struct device *net_eth_get_ptp_clock_by_index(int index)

return net_eth_get_ptp_clock(iface);
}
#endif

#ifdef CONFIG_USERSPACE
Z_SYSCALL_HANDLER(net_eth_get_ptp_clock_by_index, index)
{
return (u32_t)z_impl_net_eth_get_ptp_clock_by_index(index);
}
#endif /* CONFIG_USERSPACE */
#else /* CONFIG_PTP_CLOCK */
struct device *z_impl_net_eth_get_ptp_clock_by_index(int index)
{
ARG_UNUSED(index);

return NULL;
}
#endif /* CONFIG_PTP_CLOCK */

#if defined(CONFIG_NET_GPTP)
int net_eth_get_ptp_port(struct net_if *iface)
@@ -24,3 +24,5 @@ CONFIG_NET_SHELL=n
CONFIG_PTP_CLOCK=y
CONFIG_ETH_NATIVE_POSIX=n
CONFIG_COVERAGE=n
CONFIG_TEST_USERSPACE=y
CONFIG_HEAP_MEM_POOL_SIZE=128
@@ -60,6 +60,7 @@ static struct in6_addr ll_addr = { { { 0xfe, 0x80, 0x43, 0xb8, 0, 0, 0, 0,
/* Keep track of all ethernet interfaces */
static struct net_if *eth_interfaces[MAX_NUM_INTERFACES];

static ZTEST_BMEM int ptp_clocks[MAX_NUM_INTERFACES - 1];
static int ptp_interface[MAX_NUM_INTERFACES - 1];
static int non_ptp_interface;
static bool test_failed;
@@ -298,7 +299,9 @@ static void iface_cb(struct net_if *iface, void *user_data)
if (!clk) {
non_ptp_interface = ud->eth_if_count;
} else {
ptp_interface[ptp_iface_idx++] = ud->eth_if_count;
ptp_interface[ptp_iface_idx] = ud->eth_if_count;
ptp_clocks[ptp_iface_idx] = net_if_get_by_iface(iface);
ptp_iface_idx++;
}

eth_interfaces[ud->eth_if_count++] = iface;
@@ -455,14 +458,62 @@ static void test_ptp_clock_iface_2(void)
test_ptp_clock_iface(ptp_interface[1]);
}

static ZTEST_BMEM struct device *clk0;
static ZTEST_BMEM struct device *clk1;

static void test_ptp_clock_get_by_index(void)
{
struct device *clk, *clk_by_index;
int idx;

idx = ptp_interface[0];

clk = net_eth_get_ptp_clock(eth_interfaces[idx]);
zassert_not_null(clk, "PTP 0 not found");

clk0 = clk;

clk_by_index = net_eth_get_ptp_clock_by_index(ptp_clocks[0]);
zassert_not_null(clk_by_index, "PTP 0 not found");

zassert_equal(clk, clk_by_index, "Interface index %d invalid", idx);

idx = ptp_interface[1];

clk = net_eth_get_ptp_clock(eth_interfaces[idx]);
zassert_not_null(clk, "PTP 1 not found");

clk1 = clk;

clk_by_index = net_eth_get_ptp_clock_by_index(ptp_clocks[1]);
zassert_not_null(clk_by_index, "PTP 1 not found");

zassert_equal(clk, clk_by_index, "Interface index %d invalid", idx);
}

static void test_ptp_clock_get_by_index_user(void)
{
struct device *clk_by_index;

clk_by_index = net_eth_get_ptp_clock_by_index(ptp_clocks[0]);
zassert_not_null(clk_by_index, "PTP 0 not found");
zassert_equal(clk0, clk_by_index, "Invalid PTP clock 0");

clk_by_index = net_eth_get_ptp_clock_by_index(ptp_clocks[1]);
zassert_not_null(clk_by_index, "PTP 1 not found");
zassert_equal(clk1, clk_by_index, "Invalid PTP clock 1");
}

void test_main(void)
{
ztest_test_suite(ptp_clock_test,
ztest_unit_test(check_interfaces),
ztest_unit_test(address_setup),
ztest_unit_test(test_ptp_clock_interfaces),
ztest_unit_test(test_ptp_clock_iface_1),
ztest_unit_test(test_ptp_clock_iface_2)
ztest_unit_test(test_ptp_clock_iface_2),
ztest_unit_test(test_ptp_clock_get_by_index),
ztest_user_unit_test(test_ptp_clock_get_by_index_user)
);

ztest_run_test_suite(ptp_clock_test);

0 comments on commit 95e8498

Please sign in to comment.
You can’t perform that action at this time.