Skip to content

Commit

Permalink
clkmgr: first draft of end to end simulation, using clknetsim.
Browse files Browse the repository at this point in the history
Signed-off-by: Erez Geva <ErezGeva2@gmail.com>
  • Loading branch information
erezgeva committed Feb 21, 2025
1 parent b6e87a2 commit b609b0e
Show file tree
Hide file tree
Showing 9 changed files with 368 additions and 57 deletions.
4 changes: 4 additions & 0 deletions .reuse/dep5
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,7 @@ License: LGPL-2.1-or-later
Files: rpm/external/libchrony.patch
Copyright: 2023 © Miroslav Lichvar
License: LGPL-2.1-or-later

Files: clkmgr/tool/clknetsim/*
Copyright: 2024 © Erez Geva
License: GPL-2.0-or-later
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ SRC_FILES_DIR:=$(wildcard README.md t*/*.pl */*/*.m4 .reuse/* */gitlab*\
*/github* */*.opt configure.ac src/*.m4 */*.md t*/*.sh */*/*.sh swig/*/*\
*/*.i */*/msgCall.i */*/warn.i $(CLKMGR_DIR)/*/*.i man/*\
$(PMC_DIR)/phc_ctl $(PMC_DIR)/*.[ch]* */Makefile [wc]*/*/Makefile\
$(CLKMGR_DIR)/sample/*.c* $(CLKMGR_DIR)/image/*\
$(CLKMGR_DIR)/sample/*.c* $(CLKMGR_DIR)/image/* $(CLKMGR_DIR)/tool/clknetsim/*\
*/*/*test*/*.go LICENSES/* *.in tools/*.in $(HMAC_SRC)/*.cpp)\
src/ver.h.in src/name.h.in $(SRCS) $(HEADERS_SRCS) LICENSE\
$(MAKEFILE_LIST) credits $(SRCS_CLKMGR)
Expand Down Expand Up @@ -857,7 +857,7 @@ CLEAN_DIRS:=$(filter %/, $(wildcard wrappers/lua/*/ wrappers/python/*/ rpm/[BRS]
wrappers/go/$(SWIG_LNAME) $(filter-out %.md,$(wildcard doc/*))
DISTCLEAN:=configure configure~ defs.mk aclocal.m4 libtool install-sh\
ltmain.sh $(wildcard src/config.h* config.*)
DISTCLEAN_DIRS:=autom4te.cache m4
DISTCLEAN_DIRS:=autom4te.cache m4 $(CLKMGR_DIR)/sim

clean: deb_clean
$(Q_CLEAN)$(RM) $(CLEAN)
Expand Down
1 change: 1 addition & 0 deletions clkmgr/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
/doc/
/utest/utest_*
/pub/clkmgr/types*.h
/sim
16 changes: 15 additions & 1 deletion clkmgr/proxy/connect_chrony.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <cstring>
#include <unistd.h>
#include <cmath>
#include <sys/stat.h>

__CLKMGR_NAMESPACE_USE;

Expand All @@ -35,6 +36,14 @@ struct ThreadArgs {
int report_index;
};

static inline bool isFileSock(const char *file)
{
struct stat sb;
if(stat(file, &sb) != 0)
return false;
return (sb.st_mode & S_IFMT) == S_IFSOCK;
}

void chrony_notify_client()
{
PrintDebug("[clkmgr]::notify_client");
Expand Down Expand Up @@ -148,8 +157,13 @@ void start_monitor_thread(chrony_session *s, int report_index)

void ConnectChrony::connect_chrony()
{
const char *chronyd_addr = "/var/run/chrony/chronyd.sock";
if(!isFileSock(chronyd_addr)) {
PrintInfo("Skip chrony.");
return;
}
/* connect to chronyd unix socket*/
fd = chrony_open_socket("/var/run/chrony/chronyd.sock");
fd = chrony_open_socket(chronyd_addr);
chrony_session *s;
if(chrony_init_session(&s, fd) == CHRONY_OK) {
start_monitor_thread(s, report_index);
Expand Down
119 changes: 65 additions & 54 deletions clkmgr/proxy/connect_ptp4l.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@
/* libptpmgmt */
#include "msg.h"
#include "sock.h"
#include "err.h"

#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <unistd.h>
#include <atomic>

__CLKMGR_NAMESPACE_USE;

Expand All @@ -31,12 +34,22 @@ using namespace ptpmgmt;
static const size_t bufSize = 2000;
static char buf[bufSize];
static ptpmgmt::Message msg;
static ptpmgmt::Message msgu;
static ptpmgmt::SockUnix sku;
static ptpmgmt::SockBase *sk = &sku;
static ptpmgmt::SUBSCRIBE_EVENTS_NP_t events_tlv;
static atomic<bool> sk_init(false);
ptp_event clockEvent = { 0 };

static inline bool connect_uds()
{
const char *uds_address = getenv("CLKMGR_UDS_ADDRESS");
if(uds_address == nullptr || *uds_address == 0)
uds_address = "/var/run/ptp4l";
bool ret = sku.setDefSelfAddress() && sku.init() &&
sku.setPeerAddress(uds_address);
sk_init.store(ret);
return ret;
}
void notify_client()
{
PrintDebug("[clkmgr]::notify_client");
Expand Down Expand Up @@ -65,6 +78,9 @@ void notify_client()
void event_handle()
{
const BaseMngTlv *data = msg.getData();
#if 0
PrintDebug(string("ptp4l handle: ") + msg.mng2str_c(msg.getTlvId()));
#endif
switch(msg.getTlvId()) {
case TIME_STATUS_NP: {
const auto *timeStatus = static_cast<const TIME_STATUS_NP_t *>(data);
Expand Down Expand Up @@ -124,43 +140,29 @@ void event_handle()
notify_client();
}

static inline bool msg_send(bool local)
static inline bool msg_send(mng_vals_e id)
{
static int seq = 0;
ptpmgmt::Message *m;
if(local)
m = &msgu;
else
m = &msg;
MNG_PARSE_ERROR_e err = m->build(buf, bufSize, seq);
MNG_PARSE_ERROR_e err = msg.build(buf, bufSize, seq);
if(err != MNG_PARSE_ERROR_OK) {
PrintError(string("build error ") + msg.err2str_c(err));
PrintError(string("ptp4l msg build error ") + msg.err2str_c(err));
return false;
}
bool ret;
ret = sk->send(buf, m->getMsgLen());
if(!ret) {
#if 0
PrintError("send failed");
#endif
return false;
bool ret = sk->send(buf, msg.getMsgLen());
if(ret) {
seq++;
return true;
}
seq++;
return true;
#if 0
PrintError("ptp4l send failed: " + Error::getError() + ", ID: " +
msg.mng2str_c(id));
#endif
return false;
}

static inline bool msg_set_action(bool local, mng_vals_e id)
static inline bool msg_send_id(mng_vals_e id)
{
bool ret;
if(local)
ret = msgu.setAction(GET, id);
else
ret = msg.setAction(GET, id);
if(!ret) {
PrintError(string("Fail get ") + msg.mng2str_c(id));
return false;
}
return msg_send(local);
return msg.setAction(GET, id) && msg_send(id);
}

/**
Expand All @@ -185,19 +187,14 @@ static inline bool msg_set_action(bool local, mng_vals_e id)
* sent, false otherwise.
*
*/
bool event_subscription(clkmgr_handle **handle)
bool event_subscription(clkmgr_handle **handle = nullptr)
{
memset(events_tlv.bitmask, 0, sizeof events_tlv.bitmask);
events_tlv.duration = UINT16_MAX;
events_tlv.setEvent(NOTIFY_TIME_SYNC);
events_tlv.setEvent(NOTIFY_PORT_STATE);
events_tlv.setEvent(NOTIFY_CMLDS);
if(!msg.setAction(SET, SUBSCRIBE_EVENTS_NP, &events_tlv)) {
const mng_vals_e id = SUBSCRIBE_EVENTS_NP;
if(!msg.setAction(SET, id, &events_tlv)) {
PrintError("Fail set SUBSCRIBE_EVENTS_NP");
return false;
}
bool ret = msg_send(false);
return ret;
return msg_send(id);
}

/**
Expand All @@ -223,33 +220,44 @@ void *ptp4l_event_loop(void *arg)
{
const uint64_t timeout_ms = 1000;
bool lost_connection = false;
// Ensure socket is initilized before we start
while(!sk_init.load())
sleep(1);
for(;;) {
if(!msg_set_action(true, PORT_PROPERTIES_NP))
if(!msg_send_id(PORT_PROPERTIES_NP))
break;
ssize_t cnt;
sk->poll(timeout_ms);
cnt = sk->rcv(buf, bufSize);
if(cnt > 0) {
MNG_PARSE_ERROR_e err = msg.parse(buf, cnt);
if(err == MNG_PARSE_ERROR_OK) {
event_handle();
break;
if(sk->poll(timeout_ms)) {
cnt = sk->rcv(buf, bufSize);
if(cnt > 0) {
MNG_PARSE_ERROR_e err = msg.parse(buf, cnt);
if(err == MNG_PARSE_ERROR_OK) {
event_handle();
break;
}
}
}
#if 0
else
PrintError("ptp4l first poll fail: " + Error::getError());
#endif
}
msg_set_action(false, PORT_PROPERTIES_NP);
event_subscription(nullptr);
msg_send_id(PORT_PROPERTIES_NP);
event_subscription();
for(;;) {
if(sk->poll(timeout_ms) > 0) {
const auto cnt = sk->rcv(buf, bufSize);
if(sk->poll(timeout_ms)) {
const ssize_t cnt = sk->rcv(buf, bufSize);
if(cnt > 0) {
MNG_PARSE_ERROR_e err = msg.parse(buf, cnt);
if(err == MNG_PARSE_ERROR_OK)
event_handle();
}
} else {
#if 0
PrintError("ptp4l poll fail: " + Error::getError());
#endif
for(;;) {
if(event_subscription(nullptr))
if(event_subscription())
break;
if(!lost_connection) {
PrintError("Lost connection to ptp4l.");
Expand Down Expand Up @@ -290,14 +298,17 @@ void *ptp4l_event_loop(void *arg)
int Connect::connect(uint8_t transport_specific)
{
clockEvent.ptp4l_id = 1;
const char *uds_address = "/var/run/ptp4l";
if(!sku.setDefSelfAddress() || !sku.init() ||
!sku.setPeerAddress(uds_address))
if(!connect_uds())
return -1;
/* Set Transport Specific */
MsgParams prms = msg.getParams();
prms.transportSpecific = transport_specific;
msg.updateParams(prms);
// Prepare Events
events_tlv.duration = UINT16_MAX;
events_tlv.setEvent(NOTIFY_TIME_SYNC);
events_tlv.setEvent(NOTIFY_PORT_STATE);
events_tlv.setEvent(NOTIFY_CMLDS);
handle_connect();
return 0;
}
Expand Down
59 changes: 59 additions & 0 deletions clkmgr/tool/clknetsim/futex.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
From fd356c3cf075fd5b89cc98e8f8f1a971a699e99c Mon Sep 17 00:00:00 2001
From: Erez Geva <ErezGeva2@gmail.com>
Date: Wed, 5 Feb 2025 09:45:56 +0100
Subject: [PATCH] Add futex system call.

Signed-off-by: Erez Geva <ErezGeva2@gmail.com>
---
client.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)

diff --git a/client.c b/client.c
index 12923de..7968548 100644
--- a/client.c
+++ b/client.c
@@ -63,6 +63,7 @@
#ifdef SO_TIMESTAMPING
#include <linux/ptp_clock.h>
#include <linux/net_tstamp.h>
+#include <linux/futex.h>
#endif

#include "protocol.h"
@@ -129,6 +130,7 @@ static int (*_usleep)(useconds_t usec);
static void (*_srandom)(unsigned int seed);
static int (*_shmget)(key_t key, size_t size, int shmflg);
static void *(*_shmat)(int shmid, const void *shmaddr, int shmflg);
+static long *(*_syscall)(long number, ...);

static unsigned int node;
static int initializing = 0;
@@ -280,6 +282,7 @@ static void init_symbols(void) {
_srandom = (void (*)(unsigned int seed))dlsym(RTLD_NEXT, "srandom");
_shmget = (int (*)(key_t key, size_t size, int shmflg))dlsym(RTLD_NEXT, "shmget");
_shmat = (void *(*)(int shmid, const void *shmaddr, int shmflg))dlsym(RTLD_NEXT, "shmat");
+ _syscall = (long *(*)(long number, ...))dlsym(RTLD_NEXT, "syscall");

initialized_symbols = 1;
}
@@ -2920,6 +2923,17 @@ long syscall(long number, ...) {
}
break;
#endif
+ case __NR_futex:
+ {
+ uint32_t *uaddr = va_arg(ap, uint32_t *);
+ int futex_op = va_arg(ap, int);
+ uint32_t val = va_arg(ap, uint32_t);
+ struct timespec *timeout = va_arg(ap, struct timespec *);
+ uint32_t *uaddr2 = va_arg(ap, uint32_t *);
+ uint32_t val3 = va_arg(ap, uint32_t);
+ r = syscall(SYS_futex, uaddr, futex_op, val, timeout, uaddr2, val3);
+ }
+ break;
default:
assert(0);
}
--
2.39.5

27 changes: 27 additions & 0 deletions clkmgr/tool/clknetsim/gettid.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
From c2f41da8111e8ec0b1ee1f213a7e454fb3f10cb3 Mon Sep 17 00:00:00 2001
From: Erez Geva <ErezGeva2@gmail.com>
Date: Sun, 9 Feb 2025 01:25:44 +0100
Subject: [PATCH] Add gettid system call.

Signed-off-by: Erez Geva <ErezGeva2@gmail.com>
---
client.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/client.c b/client.c
index 7968548..af11b63 100644
--- a/client.c
+++ b/client.c
@@ -2934,6 +2934,9 @@ long syscall(long number, ...) {
r = syscall(SYS_futex, uaddr, futex_op, val, timeout, uaddr2, val3);
}
break;
+ case __NR_gettid:
+ r = syscall(SYS_gettid);
+ break;
default:
assert(0);
}
--
2.39.5

2 changes: 2 additions & 0 deletions clkmgr/tool/clknetsim/series
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
futex.patch
gettid.patch
Loading

0 comments on commit b609b0e

Please sign in to comment.