Skip to content
Permalink
Browse files

net: ppp: Add proper support to receive Echo-Reply message

Currently only net-shell calls net_ppp_ping() command, so make
it return the amount of time that it took to receive Echo-Reply
so the net-shell can print the round trip time value.

Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
  • Loading branch information...
jukkar committed Jun 25, 2019
1 parent a62c6b2 commit c4a692a85f75ab27f49b4c9e17828a6a24903fdf
Showing with 70 additions and 3 deletions.
  1. +23 −0 include/net/ppp.h
  2. +9 −0 subsys/net/ip/net_shell.c
  3. +10 −1 subsys/net/l2/ppp/fsm.c
  4. +28 −2 subsys/net/l2/ppp/ppp_l2.c
@@ -182,6 +182,17 @@ enum ipv6cp_option_type {
IPV6CP_OPTION_INTERFACE_IDENTIFIER = 1,
} __packed;

/**
* @typedef net_ppp_lcp_echo_reply_cb_t
* @brief A callback function that can be called if a Echo-Reply needs to
* be received.
* @param user_data User settable data that is passed to the callback
* function.
* @param user_data_len Length of the user data.
*/
typedef void (*net_ppp_lcp_echo_reply_cb_t)(void *user_data,
size_t user_data_len);

/**
* Generic PPP Finite State Machine
*/
@@ -427,6 +438,18 @@ struct ppp_context {

#if defined(CONFIG_NET_SHELL)
struct {
struct {
/** Callback to be called when Echo-Reply is received.
*/
net_ppp_lcp_echo_reply_cb_t cb;

/** User specific data for the callback */
void *user_data;

/** User data length */
size_t user_data_len;
} echo_reply;

/** Used when waiting Echo-Reply */
struct k_sem wait_echo_reply;

@@ -3101,6 +3101,15 @@ static int cmd_net_ppp_ping(const struct shell *shell, size_t argc,
} else {
PR_INFO("PPP Echo-Req failed (%d)\n", ret);
}
} else {
if (ret > 1000) {
PR_INFO("%s%d msec\n",
"Received PPP Echo-Reply in ",
ret / 1000);
} else {
PR_INFO("%s%d usec\n",
"Received PPP Echo-Reply in ", ret);
}
}
} else {
PR_INFO("PPP network interface must be given.\n");
@@ -1109,7 +1109,16 @@ enum net_verdict ppp_fsm_recv_echo_reply(struct ppp_fsm *fsm,
NET_DBG("[%s/%p] Current state %s (%d)", fsm->name, fsm,
ppp_state_str(fsm->state), fsm->state);

return NET_DROP;
#if defined(CONFIG_NET_SHELL)
struct ppp_context *ctx = CONTAINER_OF(fsm, struct ppp_context,
lcp.fsm);
if (ctx->shell.echo_reply.cb) {
ctx->shell.echo_reply.cb(ctx->shell.echo_reply.user_data,
ctx->shell.echo_reply.user_data_len);
}
#endif /* CONFIG_NET_SHELL */

return NET_OK;
}

enum net_verdict ppp_fsm_recv_discard_req(struct ppp_fsm *fsm,
@@ -7,6 +7,7 @@
#include <logging/log.h>
LOG_MODULE_REGISTER(net_l2_ppp, CONFIG_NET_L2_PPP_LOG_LEVEL);

#include <stdlib.h>
#include <net/net_core.h>
#include <net/net_l2.h>
#include <net/net_if.h>
@@ -336,6 +337,19 @@ static int get_ppp_context(int idx, struct ppp_context **ctx,
return 0;
}

static void echo_reply_handler(void *user_data, size_t user_data_len)
{
struct ppp_context *ctx = user_data;
u32_t end_time = k_cycle_get_32();
int time_diff;

time_diff = abs(end_time - ctx->shell.echo_req_data);
ctx->shell.echo_req_data =
SYS_CLOCK_HW_CYCLES_TO_NS64(time_diff) / 1000;

k_sem_give(&ctx->shell.wait_echo_reply);
}

int net_ppp_ping(int idx, s32_t timeout)
{
struct ppp_context *ctx;
@@ -347,7 +361,10 @@ int net_ppp_ping(int idx, s32_t timeout)
return ret;
}

ctx->shell.echo_req_data = sys_rand32_get();
ctx->shell.echo_req_data = k_cycle_get_32();
ctx->shell.echo_reply.cb = echo_reply_handler;
ctx->shell.echo_reply.user_data = ctx;
ctx->shell.echo_reply.user_data_len = sizeof(ctx);

ret = ppp_send_pkt(&ctx->lcp.fsm, iface, PPP_ECHO_REQ, 0,
UINT_TO_POINTER(ctx->shell.echo_req_data),
@@ -356,7 +373,16 @@ int net_ppp_ping(int idx, s32_t timeout)
return ret;
}

return k_sem_take(&ctx->shell.wait_echo_reply, timeout);
ret = k_sem_take(&ctx->shell.wait_echo_reply, timeout);

ctx->shell.echo_reply.cb = NULL;

if (ret < 0) {
return ret;
}

/* Returns amount of microseconds waited */
return ctx->shell.echo_req_data;
}

struct ppp_context *net_ppp_context_get(int idx)

0 comments on commit c4a692a

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