From 8fe6acc6eb6e5f5706b397bfc7da74d00d5332a5 Mon Sep 17 00:00:00 2001 From: Jiahua Wang Date: Tue, 28 Jun 2022 22:01:36 -0700 Subject: [PATCH 1/2] Add mdio IPC client library Signed-off-by: Jiahua Wang --- platform/broadcom/rules.dep | 1 + platform/broadcom/rules.mk | 1 + platform/components/libmdio-ipc-client.dep | 10 + platform/components/libmdio-ipc-client.mk | 15 ++ .../components/libmdio-ipc-client/Makefile | 25 ++ .../libmdio-ipc-client/debian/changelog | 5 + .../libmdio-ipc-client/debian/compat | 1 + .../libmdio-ipc-client/debian/control | 18 ++ .../libmdio-ipc-client/debian/rules | 46 ++++ .../libmdio-ipc-client/mdio_ipc_client.cpp | 226 ++++++++++++++++++ .../libmdio-ipc-client/mdio_ipc_client.h | 24 ++ 11 files changed, 372 insertions(+) create mode 100644 platform/components/libmdio-ipc-client.dep create mode 100644 platform/components/libmdio-ipc-client.mk create mode 100644 platform/components/libmdio-ipc-client/Makefile create mode 100644 platform/components/libmdio-ipc-client/debian/changelog create mode 100644 platform/components/libmdio-ipc-client/debian/compat create mode 100644 platform/components/libmdio-ipc-client/debian/control create mode 100755 platform/components/libmdio-ipc-client/debian/rules create mode 100644 platform/components/libmdio-ipc-client/mdio_ipc_client.cpp create mode 100644 platform/components/libmdio-ipc-client/mdio_ipc_client.h diff --git a/platform/broadcom/rules.dep b/platform/broadcom/rules.dep index 36b727570e6..61db3cf98ed 100644 --- a/platform/broadcom/rules.dep +++ b/platform/broadcom/rules.dep @@ -27,6 +27,7 @@ include $(PLATFORM_PATH)/one-image.dep include $(PLATFORM_PATH)/raw-image.dep include $(PLATFORM_PATH)/one-aboot.dep include $(PLATFORM_PATH)/libsaithrift-dev.dep +include $(PLATFORM_PATH)/../components/libmdio-ipc-client.dep include $(PLATFORM_PATH)/docker-syncd-brcm-dnx.dep include $(PLATFORM_PATH)/docker-syncd-brcm-dnx-rpc.dep include $(PLATFORM_PATH)/../components/docker-gbsyncd-credo.dep diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index b13a145b2b0..c229cd4ca11 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -26,6 +26,7 @@ include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/raw-image.mk include $(PLATFORM_PATH)/one-aboot.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk +include $(PLATFORM_PATH)/../components/libmdio-ipc-client.mk include $(PLATFORM_PATH)/docker-syncd-brcm-dnx.mk include $(PLATFORM_PATH)/docker-syncd-brcm-dnx-rpc.mk include $(PLATFORM_PATH)/../components/docker-gbsyncd-credo.mk diff --git a/platform/components/libmdio-ipc-client.dep b/platform/components/libmdio-ipc-client.dep new file mode 100644 index 00000000000..9b241a66cf4 --- /dev/null +++ b/platform/components/libmdio-ipc-client.dep @@ -0,0 +1,10 @@ + +SPATH := $($(MDIO_IPC_CLIENT_LIBRARY)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) platform/components/libmdio-ipc-client.mk platform/components/libmdio-ipc-client.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(SPATH)) + +$(MDIO_IPC_CLIENT_LIBRARY)_CACHE_MODE := GIT_CONTENT_SHA +$(MDIO_IPC_CLIENT_LIBRARY)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(LOCAL_PAI_DEBS_PATH) +$(MDIO_IPC_CLIENT_LIBRARY)_DEP_FILES := $(DEP_FILES) + diff --git a/platform/components/libmdio-ipc-client.mk b/platform/components/libmdio-ipc-client.mk new file mode 100644 index 00000000000..0e070b11a3e --- /dev/null +++ b/platform/components/libmdio-ipc-client.mk @@ -0,0 +1,15 @@ +# MDIO IPC client library + +MDIO_IPC_CLIENT_LIB_VERSION = 1.1 + +export MDIO_IPC_CLIENT_LIB_VERSION + +MDIO_IPC_CLIENT_LIBRARY = libmdio-ipc-client_$(MDIO_IPC_CLIENT_LIB_VERSION)_amd64.deb +MDIO_IPC_CLIENT_LIBRARY_DBG = libmdio-ipc-client-dbg_$(MDIO_IPC_CLIENT_LIB_VERSION)_amd64.deb + +$(MDIO_IPC_CLIENT_LIBRARY)_SRC_PATH = platform/components/libmdio-ipc-client +SONIC_DPKG_DEBS += $(MDIO_IPC_CLIENT_LIBRARY) +$(eval $(call add_derived_package,$(MDIO_IPC_CLIENT_LIBRARY),$(MDIO_IPC_CLIENT_LIBRARY_DBG))) + +$(MDIO_IPC_CLIENT_LIBRARY)_DEPENDS += $(BRCM_SAI_DEV) + diff --git a/platform/components/libmdio-ipc-client/Makefile b/platform/components/libmdio-ipc-client/Makefile new file mode 100644 index 00000000000..2e9e71a0be6 --- /dev/null +++ b/platform/components/libmdio-ipc-client/Makefile @@ -0,0 +1,25 @@ +PREFIX ?= + +CC := g++ +CXX := g++ + +CFLAGS := -Os -g -fPIC -Wall -Werror -Wno-uninitialized -Wno-format-truncation \ + -I/usr/include/sai +CFLAGS += $(SONIC_COMMON_CFLAGS) +CXXFLAGS := $(CFLAGS) +LDFLAGS := $(SONIC_COMMON_LDFLAGS) + +SRCS := mdio_ipc_client.cpp +OBJS := $(SRCS:.cpp=.o) + +all: libmdio_ipc_client.so + +$(OBJS) :%.o:%.cpp + $(CXX) -c -o $@ $^ $(CXXFLAGS) + + +libmdio_ipc_client.so: $(OBJS) + $(CXX) -shared -o $@ $^ $(LDFLAGS) + +clean: + rm -f libmdio_ipc_client.so *.o diff --git a/platform/components/libmdio-ipc-client/debian/changelog b/platform/components/libmdio-ipc-client/debian/changelog new file mode 100644 index 00000000000..1f461ab1119 --- /dev/null +++ b/platform/components/libmdio-ipc-client/debian/changelog @@ -0,0 +1,5 @@ +libmdio-ipc-client (1.1) unstable; urgency=low + + * Initial release. + + -- Jiahua Wang Fri, 18 Dec 2020 12:00:00 -0800 diff --git a/platform/components/libmdio-ipc-client/debian/compat b/platform/components/libmdio-ipc-client/debian/compat new file mode 100644 index 00000000000..f599e28b8ab --- /dev/null +++ b/platform/components/libmdio-ipc-client/debian/compat @@ -0,0 +1 @@ +10 diff --git a/platform/components/libmdio-ipc-client/debian/control b/platform/components/libmdio-ipc-client/debian/control new file mode 100644 index 00000000000..2f9dce0df1e --- /dev/null +++ b/platform/components/libmdio-ipc-client/debian/control @@ -0,0 +1,18 @@ +Source: libmdio-ipc-client +Section: main +Priority: extra +Maintainer: Jiahua Wang +Build-Depends: debhelper (>= 9), bzip2 +Standards-Version: 3.9.3 + +Package: libmdio-ipc-client +Architecture: amd64 +Depends: ${shlibs:Depends} +Description: Package contains MDIO access library for gbsyncd + +Package: libmdio-ipc-client-dbg +Architecture: any +Section: debug +Priority: extra +Depends: libmdio-ipc-client (=${binary:Version}) +Description: debugging symbols for libmdio-ipc-client diff --git a/platform/components/libmdio-ipc-client/debian/rules b/platform/components/libmdio-ipc-client/debian/rules new file mode 100755 index 00000000000..125e01aa130 --- /dev/null +++ b/platform/components/libmdio-ipc-client/debian/rules @@ -0,0 +1,46 @@ +#!/usr/bin/make -f + +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +export DH_VERBOSE = 1 + +# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* +DPKG_EXPORT_BUILDFLAGS = 1 +include /usr/share/dpkg/default.mk + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + +PACKAGE_NAME := libmdio-ipc-client + +# main packaging script based on dh7 syntax +%: + dh $@ + +build: + $(MAKE) + +clean: + $(MAKE) clean + +override_dh_auto_install: + dh_installdirs -p $(PACKAGE_NAME) /usr/lib + cp libmdio_ipc_client.so debian/$(PACKAGE_NAME)/usr/lib + dh_installdirs -p $(PACKAGE_NAME) /usr/include + cp mdio_ipc_client.h debian/$(PACKAGE_NAME)/usr/include + dh_auto_install --destdir=debian/$(PACKAGE_NAME) + +override_dh_auto_test: + +override_dh_clean: + dh_auto_clean + $(MAKE) clean + +override_dh_strip: + dh_strip -p$(PACKAGE_NAME) --dbg-package=$(PACKAGE_NAME)-dbg diff --git a/platform/components/libmdio-ipc-client/mdio_ipc_client.cpp b/platform/components/libmdio-ipc-client/mdio_ipc_client.cpp new file mode 100644 index 00000000000..2a6dbf8f7e7 --- /dev/null +++ b/platform/components/libmdio-ipc-client/mdio_ipc_client.cpp @@ -0,0 +1,226 @@ +/* Includes */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include "sai.h" +} + +#define SAI_IPC_SOCK_DIR_SYNCD "/var/run/sswsyncd" +#define SAI_IPC_SOCK_DIR_HOST "/var/run/docker-syncd" +#define SAI_IPC_SOCK_FILE "mdio-ipc" +#define SAI_IPC_BUFF_SIZE 256 + +#define CONN_TIMEOUT 25 /* shorter than 30 sec on server side */ + +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + +/* Global variables */ + +static int syncd_mdio_ipc_command(char *cmd, char *resp) +{ + int fd; + ssize_t ret; + size_t len; + struct sockaddr_un saddr, caddr; + static int sock = 0; + static char path[128] = { 0 }; + static time_t timeout = 0; + + if (timeout < time(NULL)) + { + /* It might already be timed out at the server side, reconnect ... */ + if (sock > 0) + { + close(sock); + } + sock = 0; + } + + if (strlen(path) == 0) + { + strcpy(path, SAI_IPC_SOCK_DIR_SYNCD); + fd = open(path, O_DIRECTORY); + if (fd < 0) + { + printf("%s: Program is not run on host\n", __func__); + strcpy(path, SAI_IPC_SOCK_DIR_HOST); + fd = open(path, O_DIRECTORY); + if (fd < 0) + { + printf("%s: Unable to open the directory for IPC\n", __func__); + return errno; + } + } + } + + if (sock <= 0) + { + sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock < 0) + { + perror("socket()"); + return errno; + } + + caddr.sun_family = AF_UNIX; + snprintf(caddr.sun_path, sizeof(caddr.sun_path), "%s/%s.cli.%d", path, SAI_IPC_SOCK_FILE, getpid()); + unlink(caddr.sun_path); + if (bind(sock, (struct sockaddr *)&caddr, sizeof(caddr)) < 0) + { + perror("bind()"); + close(sock); + sock = 0; + return errno; + } + + saddr.sun_family = AF_UNIX; + snprintf(saddr.sun_path, sizeof(saddr.sun_path), "%s/%s.srv", path, SAI_IPC_SOCK_FILE); + if (connect(sock, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) + { + perror("connect()"); + close(sock); + sock = 0; + unlink(caddr.sun_path); + return errno; + } + } + + len = strlen(cmd); + ret = send(sock, cmd, len, 0); + if (ret < (ssize_t)len) + { + printf("send failed, ret=%ld, expected=%ld\n", ret, len); + close(sock); + sock = 0; + unlink(caddr.sun_path); + return -EIO; + } + + ret = recv(sock, resp, SAI_IPC_BUFF_SIZE - 1, 0); + if (ret <= 0) + { + printf("recv failed, ret=%ld\n", ret); + close(sock); + sock = 0; + unlink(caddr.sun_path); + return -EIO; + } + + timeout = time(NULL) + CONN_TIMEOUT; + return (int)strtol(resp, NULL, 0); +} + + +/* Function to read data from MDIO interface */ +extern "C" sai_status_t mdio_read(uint64_t platform_context, uint32_t mdio_addr, uint32_t reg_addr, + uint32_t number_of_registers, uint32_t *data) +{ + int rc = SAI_STATUS_FAILURE; + char cmd[SAI_IPC_BUFF_SIZE], resp[SAI_IPC_BUFF_SIZE]; + + if (number_of_registers > 1) + { + printf("Multiple register reads are not supported, num_of_registers: %d\n", number_of_registers); + return SAI_STATUS_FAILURE; + } + + pthread_mutex_lock(&mutex); + + sprintf(cmd, "mdio 0x%x 0x%x\n", mdio_addr, reg_addr); + if (syncd_mdio_ipc_command(cmd, resp) == 0) + { + *data = (uint32_t)strtoul(strchrnul(resp, ' ') + 1, NULL, 0); + rc = SAI_STATUS_SUCCESS; + } + + pthread_mutex_unlock(&mutex); + return rc; +} + +/* Function to write data to MDIO interface */ +extern "C" sai_status_t mdio_write(uint64_t platform_context, uint32_t mdio_addr, uint32_t reg_addr, + uint32_t number_of_registers, const uint32_t *data) +{ + int rc = SAI_STATUS_FAILURE; + char cmd[SAI_IPC_BUFF_SIZE], resp[SAI_IPC_BUFF_SIZE]; + + if (number_of_registers > 1) + { + printf("Multiple register reads are not supported, num_of_registers: %d\n", number_of_registers); + return SAI_STATUS_FAILURE; + } + + pthread_mutex_lock(&mutex); + + sprintf(cmd, "mdio 0x%x 0x%x 0x%x\n", mdio_addr, reg_addr, *data); + if (syncd_mdio_ipc_command(cmd, resp) == 0) + { + rc = SAI_STATUS_SUCCESS; + } + + pthread_mutex_unlock(&mutex); + return rc; +} + +/* Function to read data using clause 22 from MDIO interface */ +extern "C" sai_status_t mdio_read_cl22(uint64_t platform_context, uint32_t mdio_addr, uint32_t reg_addr, + uint32_t number_of_registers, uint32_t *data) +{ + int rc = SAI_STATUS_FAILURE; + char cmd[SAI_IPC_BUFF_SIZE], resp[SAI_IPC_BUFF_SIZE]; + + if (number_of_registers > 1) + { + printf("Multiple register reads are not supported, num_of_registers: %d\n", number_of_registers); + return SAI_STATUS_FAILURE; + } + + pthread_mutex_lock(&mutex); + + sprintf(cmd, "mdio-cl22 0x%x 0x%x\n", mdio_addr, reg_addr); + if (syncd_mdio_ipc_command(cmd, resp) == 0) + { + *data = (uint32_t)strtoul(strchrnul(resp, ' ') + 1, NULL, 0); + rc = SAI_STATUS_SUCCESS; + } + + pthread_mutex_unlock(&mutex); + return rc; +} + +/* Function to write data using clause 22 to MDIO interface */ +extern "C" sai_status_t mdio_write_cl22(uint64_t platform_context, uint32_t mdio_addr, uint32_t reg_addr, + uint32_t number_of_registers, const uint32_t *data) +{ + int rc = SAI_STATUS_FAILURE; + char cmd[SAI_IPC_BUFF_SIZE], resp[SAI_IPC_BUFF_SIZE]; + + if (number_of_registers > 1) + { + printf("Multiple register reads are not supported, num_of_registers: %d\n", number_of_registers); + return SAI_STATUS_FAILURE; + } + + pthread_mutex_lock(&mutex); + + sprintf(cmd, "mdio-cl22 0x%x 0x%x 0x%x\n", mdio_addr, reg_addr, *data); + if (syncd_mdio_ipc_command(cmd, resp) == 0) + { + rc = SAI_STATUS_SUCCESS; + } + + pthread_mutex_unlock(&mutex); + return rc; +} diff --git a/platform/components/libmdio-ipc-client/mdio_ipc_client.h b/platform/components/libmdio-ipc-client/mdio_ipc_client.h new file mode 100644 index 00000000000..f831aba1e8b --- /dev/null +++ b/platform/components/libmdio-ipc-client/mdio_ipc_client.h @@ -0,0 +1,24 @@ +#ifndef __MDIO_IPC_CLIENT_H__ +#define __MDIO_IPC_CLIENT_H__ + +#include +#include + +extern "C" { +#include "sai.h" +} + +/* Function declarations */ +extern "C" { +sai_status_t mdio_read(uint64_t platform_context, uint32_t mdio_addr, uint32_t reg_addr, + uint32_t number_of_registers, uint32_t *data); +sai_status_t mdio_write(uint64_t platform_context, uint32_t mdio_addr, + uint32_t reg_addr, uint32_t number_of_registers, uint32_t *data); + +sai_status_t mdio_read_cl22(uint64_t platform_context, uint32_t mdio_addr, uint32_t reg_addr, + uint32_t number_of_registers, uint32_t *data); +sai_status_t mdio_write_cl22(uint64_t platform_context, uint32_t mdio_addr, + uint32_t reg_addr, uint32_t number_of_registers, uint32_t *data); +} + +#endif /* __MDIO_IPC_CLIENT_H__ */ From 9ac81adc936648bb48879d97613f4849e68fa829 Mon Sep 17 00:00:00 2001 From: Jiahua Wang Date: Thu, 30 Jun 2022 17:41:02 -0700 Subject: [PATCH 2/2] Fix typo in mdio_ipc_client.h Signed-off-by: Jiahua Wang --- platform/components/libmdio-ipc-client/mdio_ipc_client.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/components/libmdio-ipc-client/mdio_ipc_client.h b/platform/components/libmdio-ipc-client/mdio_ipc_client.h index f831aba1e8b..1dbeaf4f0d1 100644 --- a/platform/components/libmdio-ipc-client/mdio_ipc_client.h +++ b/platform/components/libmdio-ipc-client/mdio_ipc_client.h @@ -13,12 +13,12 @@ extern "C" { sai_status_t mdio_read(uint64_t platform_context, uint32_t mdio_addr, uint32_t reg_addr, uint32_t number_of_registers, uint32_t *data); sai_status_t mdio_write(uint64_t platform_context, uint32_t mdio_addr, - uint32_t reg_addr, uint32_t number_of_registers, uint32_t *data); + uint32_t reg_addr, uint32_t number_of_registers, const uint32_t *data); sai_status_t mdio_read_cl22(uint64_t platform_context, uint32_t mdio_addr, uint32_t reg_addr, uint32_t number_of_registers, uint32_t *data); sai_status_t mdio_write_cl22(uint64_t platform_context, uint32_t mdio_addr, - uint32_t reg_addr, uint32_t number_of_registers, uint32_t *data); + uint32_t reg_addr, uint32_t number_of_registers, const uint32_t *data); } #endif /* __MDIO_IPC_CLIENT_H__ */