From 849840d80532276e5ce51db8a0762559ea3be860 Mon Sep 17 00:00:00 2001 From: Dmitry Kozlov Date: Wed, 2 Dec 2015 19:01:54 +0300 Subject: accel-dp: formed skeleton --- accel-pppd/libnetlink/iputils.c | 9 +- accel-pppd/net/CMakeLists.txt | 4 +- accel-pppd/net/dp.c | 493 ++++++++++++++++++++++++++++++++++++++++ accel-pppd/net/dpdk.c | 493 ---------------------------------------- accel-pppd/net/if_dp.h | 1 + accel-pppd/net/if_dpdk.h | 67 ------ 6 files changed, 504 insertions(+), 563 deletions(-) create mode 100644 accel-pppd/net/dp.c delete mode 100644 accel-pppd/net/dpdk.c create mode 120000 accel-pppd/net/if_dp.h delete mode 100644 accel-pppd/net/if_dpdk.h (limited to 'accel-pppd') diff --git a/accel-pppd/libnetlink/iputils.c b/accel-pppd/libnetlink/iputils.c index 7dbdf677..8118ce67 100644 --- a/accel-pppd/libnetlink/iputils.c +++ b/accel-pppd/libnetlink/iputils.c @@ -16,13 +16,20 @@ //#include #include -#include "triton.h" #include "log.h" #include "libnetlink.h" #include "iputils.h" +#ifdef ACCEL_DP +#define _malloc(x) malloc(x) +#define _free(x) free(x) +#include "init.h" +#include "common.h" +#else +#include "triton.h" #include "memdebug.h" +#endif struct arg { diff --git a/accel-pppd/net/CMakeLists.txt b/accel-pppd/net/CMakeLists.txt index db3aca3e..422ca06a 100644 --- a/accel-pppd/net/CMakeLists.txt +++ b/accel-pppd/net/CMakeLists.txt @@ -1,7 +1,7 @@ IF (DEFINED DPDK) - ADD_LIBRARY(net-dpdk SHARED dpdk.c) + ADD_LIBRARY(net-dp SHARED dp.c) - INSTALL(TARGETS net-dpdk + INSTALL(TARGETS net-dp LIBRARY DESTINATION lib${LIB_SUFFIX}/accel-ppp ) ENDIF() diff --git a/accel-pppd/net/dp.c b/accel-pppd/net/dp.c new file mode 100644 index 00000000..e30d74b2 --- /dev/null +++ b/accel-pppd/net/dp.c @@ -0,0 +1,493 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "triton.h" +#include "ap_net.h" +#include "log.h" + +#include "if_dp.h" + +static struct sockaddr_un dp_addr; +static int dp_sock; + +static int dp_socket(int domain, int type, int proto) +{ + struct msg_socket msg = { + .id = MSG_SOCKET, + .domain = domain, + .type = type, + .proto = proto, + }; + struct msg_result res; + + int sock = socket(AF_UNIX, SOCK_DGRAM, 0); + if (sock < 0) + return -1; + + if (connect(sock, (struct sockaddr *)&dp_addr, sizeof(dp_addr))) { + close(sock); + return -1; + } + + if (write(sock, &msg, sizeof(msg)) < 0) { + close(sock); + return -1; + } + + if (read(sock, &res, sizeof(res)) != sizeof(res)) { + close(sock); + errno = EBADE; + return -1; + } + + if (res.err) { + close(sock); + errno = res.err; + return -1; + } + + return sock; +} + +static int dp_connect(int sock, const struct sockaddr *addr, socklen_t len) +{ + struct msg_connect msg = { + .id = MSG_CONNECT, + .addrlen = len, + }; + struct msg_result res; + struct iovec iov[2] = { + { + .iov_base = &msg, + .iov_len = sizeof(msg), + }, + { + .iov_base = (void *)addr, + .iov_len = len, + } + }; + + if (writev(sock, iov, 2) < 0) + return -1; + + if (read(sock, &res, sizeof(res)) != sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + return 0; +} + +static int dp_bind(int sock, const struct sockaddr *addr, socklen_t len) +{ + struct msg_bind msg = { + .id = MSG_BIND, + .addrlen = len, + }; + struct msg_result res; + struct iovec iov[2] = { + { + .iov_base = &msg, + .iov_len = sizeof(msg), + }, + { + .iov_base = (void *)addr, + .iov_len = len, + } + }; + + if (writev(sock, iov, 2) < 0) + return -1; + + if (read(sock, &res, sizeof(res)) != sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + return 0; +} + +static int dp_listen(int sock, int backlog) +{ + struct msg_listen msg = { + .id = MSG_LISTEN, + .backlog = backlog, + }; + struct msg_result res; + + if (write(sock, &msg, sizeof(msg)) < 0) + return -1; + + if (read(sock, &res, sizeof(res)) != sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + return 0; +} + +static ssize_t dp_read(int sock, void *buf, size_t len) +{ + struct msg_recv msg = { + .id = MSG_RECV, + .len = len, + .flags = 0, + .addrlen = 0, + }; + struct msg_result res; + struct iovec iov[2] = { + { + .iov_base = &res, + .iov_len = sizeof(res), + }, + { + .iov_base = buf, + .iov_len = len, + } + }; + + if (write(sock, &msg, sizeof(msg))) + return -1; + +again: + if (readv(sock, iov, 2) < sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + if (!res.len) + goto again; + + return res.len; +} + +static ssize_t dp_recvfrom(int sock, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen) +{ + struct msg_recv msg = { + .id = MSG_RECV, + .len = len, + .flags = flags, + .addrlen = 0, + }; + struct msg_result res; + struct iovec iov[2] = { + { + .iov_base = &res, + .iov_len = sizeof(res), + }, + { + .iov_base = buf, + .iov_len = len, + } + }; + + if (write(sock, &msg, sizeof(msg))) + return -1; + +again: + if (readv(sock, iov, 2) < sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + if (!res.len) + goto again; + + memcpy(src_addr, &res.ss, res.addrlen); + *addrlen = res.addrlen; + + return res.len; +} + +static ssize_t dp_write(int sock, const void *buf, size_t len) +{ + struct msg_send msg = { + .id = MSG_SEND, + .len = len, + .flags = 0, + .addrlen = 0, + }; + struct msg_result res; + struct iovec iov[2] = { + { + .iov_base = &msg, + .iov_len = sizeof(msg), + }, + { + .iov_base = (void *)buf, + .iov_len = len, + } + }; + + if (writev(sock, iov, 2) < 0) + return -1; + + if (read(sock, &res, sizeof(res)) != sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + return res.len; +} + +static ssize_t dp_sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) +{ + struct msg_send msg = { + .id = MSG_SEND, + .len = len, + .flags = flags, + .addrlen = addrlen, + }; + struct msg_result res; + struct iovec iov[3] = { + { + .iov_base = &msg, + .iov_len = sizeof(msg), + }, + { + .iov_base = (void *)dest_addr, + .iov_len = addrlen, + }, + { + .iov_base = (void *)buf, + .iov_len = len, + } + }; + + if (writev(sock, iov, 3) < 0) + return -1; + + if (read(sock, &res, sizeof(res)) != sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + return res.len; +} + +static int dp_set_nonblocking(int sock, int f) +{ + return 0; +} + +static int dp_setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen) +{ + return 0; +} + + +static int dp_ppp_open() +{ + int id = MSG_PPP_OPEN; + struct msg_result res; + int sock = socket(AF_UNIX, SOCK_STREAM, 0); + + if (sock < 0) + return -1; + + if (connect(sock, (struct sockaddr *)&dp_addr, sizeof(dp_addr))) { + close(sock); + return -1; + } + + if (write(sock, &id, sizeof(id)) < 0) { + close(sock); + return -1; + } + + if (read(sock, &res, sizeof(res)) != sizeof(res)) { + close(sock); + errno = EBADE; + return -1; + } + + if (res.err) { + close(sock); + errno = res.err; + return -1; + } + + return sock; +} + +static int dp_ppp_ioctl(int fd, unsigned long request, void *arg) +{ + struct msg_ioctl msg = { + .id = MSG_IOCTL, + .request = request, + }; + struct msg_result res; + struct iovec iov[2] = { + { + .iov_base = &msg, + .iov_len = sizeof(msg), + }, + { + .iov_base = arg, + } + }; + + switch (request) { + case PPPIOCSNPMODE: + iov[1].iov_len = sizeof(struct npioctl); + break; + case PPPIOCSCOMPRESS: + iov[1].iov_len = sizeof(struct ppp_option_data); + break; + case PPPIOCGFLAGS: + case PPPIOCGCHAN: + case PPPIOCNEWUNIT: + iov[1].iov_len = 0; + break; + case PPPIOCSFLAGS: + case PPPIOCSMRU: + case PPPIOCATTCHAN: + case PPPIOCCONNECT: + iov[1].iov_len = sizeof(int); + break; + + } + + if (writev(fd, iov, iov[1].iov_len ? 2 : 1) < 0) + return -1; + + iov[0].iov_base = &res; + iov[0].iov_len = sizeof(res); + iov[1].iov_base = arg; + iov[1].iov_len = 1024; + + if (readv(fd, iov, 2) < sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + return res.len; +} + +static int dp_sock_ioctl(unsigned long request, void *arg) +{ + struct msg_ioctl msg = { + .id = MSG_SOCK_IOCTL, + .request = request, + }; + struct msg_result res; + struct iovec iov[2] = { + { + .iov_base = &msg, + .iov_len = sizeof(msg), + }, + { + .iov_base = arg, + .iov_len = sizeof(struct ifreq), + } + }; + + if (writev(dp_sock, iov, 2) < 0) + return -1; + + iov[0].iov_base = &res; + iov[0].iov_len = sizeof(res); + + if (readv(dp_sock, iov, 2) < sizeof(res)) { + errno = EBADE; + return -1; + } + + if (res.err) { + errno = res.err; + return -1; + } + + return res.len; +} + +static const struct ap_net dp_net = { + .socket = dp_socket, + .connect = dp_connect, + .bind = dp_bind, + .listen = dp_listen, + .read = dp_read, + .recvfrom = dp_recvfrom, + .write = dp_write, + .sendto = dp_sendto, + .set_nonblocking = dp_set_nonblocking, + .setsockopt = dp_setsockopt, + .ppp_open = dp_ppp_open, + .ppp_ioctl = dp_ppp_ioctl, + .sock_ioctl = dp_sock_ioctl, +}; + +static void init() +{ + const char *opt = conf_get_opt("net-dpdk", "socket"); + + if (!opt) + return; + + if (strlen(opt) >= sizeof(dp_addr.sun_path)) { + log_error("net-dpdk: socket path is too long\n"); + return; + } + + strcpy(dp_addr.sun_path, opt); + + dp_addr.sun_family = AF_UNIX; + + dp_sock = socket(AF_UNIX, SOCK_DGRAM, 0); + if (dp_sock < 0) + return; + + if (connect(dp_sock, (struct sockaddr *)&dp_addr, sizeof(dp_addr))) { + log_error("dpdk: connect: %s\n", strerror(errno)); + close(dp_sock); + return; + } +} + +DEFINE_INIT(1, init) diff --git a/accel-pppd/net/dpdk.c b/accel-pppd/net/dpdk.c deleted file mode 100644 index 1a5170c9..00000000 --- a/accel-pppd/net/dpdk.c +++ /dev/null @@ -1,493 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "triton.h" -#include "ap_net.h" -#include "log.h" - -#include "if_dpdk.h" - -static struct sockaddr_un dpdk_addr; -static int dpdk_sock; - -static int dpdk_socket(int domain, int type, int proto) -{ - struct msg_socket msg = { - .id = MSG_SOCKET, - .domain = domain, - .type = type, - .proto = proto, - }; - struct msg_result res; - - int sock = socket(AF_UNIX, SOCK_DGRAM, 0); - if (sock < 0) - return -1; - - if (connect(sock, (struct sockaddr *)&dpdk_addr, sizeof(dpdk_addr))) { - close(sock); - return -1; - } - - if (write(sock, &msg, sizeof(msg)) < 0) { - close(sock); - return -1; - } - - if (read(sock, &res, sizeof(res)) != sizeof(res)) { - close(sock); - errno = EBADE; - return -1; - } - - if (res.err) { - close(sock); - errno = res.err; - return -1; - } - - return sock; -} - -static int dpdk_connect(int sock, const struct sockaddr *addr, socklen_t len) -{ - struct msg_connect msg = { - .id = MSG_CONNECT, - .addrlen = len, - }; - struct msg_result res; - struct iovec iov[2] = { - { - .iov_base = &msg, - .iov_len = sizeof(msg), - }, - { - .iov_base = (void *)addr, - .iov_len = len, - } - }; - - if (writev(sock, iov, 2) < 0) - return -1; - - if (read(sock, &res, sizeof(res)) != sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - return 0; -} - -static int dpdk_bind(int sock, const struct sockaddr *addr, socklen_t len) -{ - struct msg_bind msg = { - .id = MSG_BIND, - .addrlen = len, - }; - struct msg_result res; - struct iovec iov[2] = { - { - .iov_base = &msg, - .iov_len = sizeof(msg), - }, - { - .iov_base = (void *)addr, - .iov_len = len, - } - }; - - if (writev(sock, iov, 2) < 0) - return -1; - - if (read(sock, &res, sizeof(res)) != sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - return 0; -} - -static int dpdk_listen(int sock, int backlog) -{ - struct msg_listen msg = { - .id = MSG_LISTEN, - .backlog = backlog, - }; - struct msg_result res; - - if (write(sock, &msg, sizeof(msg)) < 0) - return -1; - - if (read(sock, &res, sizeof(res)) != sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - return 0; -} - -static ssize_t dpdk_read(int sock, void *buf, size_t len) -{ - struct msg_recv msg = { - .id = MSG_RECV, - .len = len, - .flags = 0, - .addrlen = 0, - }; - struct msg_result res; - struct iovec iov[2] = { - { - .iov_base = &res, - .iov_len = sizeof(res), - }, - { - .iov_base = buf, - .iov_len = len, - } - }; - - if (write(sock, &msg, sizeof(msg))) - return -1; - -again: - if (readv(sock, iov, 2) < sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - if (!res.len) - goto again; - - return res.len; -} - -static ssize_t dpdk_recvfrom(int sock, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen) -{ - struct msg_recv msg = { - .id = MSG_RECV, - .len = len, - .flags = flags, - .addrlen = 0, - }; - struct msg_result res; - struct iovec iov[2] = { - { - .iov_base = &res, - .iov_len = sizeof(res), - }, - { - .iov_base = buf, - .iov_len = len, - } - }; - - if (write(sock, &msg, sizeof(msg))) - return -1; - -again: - if (readv(sock, iov, 2) < sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - if (!res.len) - goto again; - - memcpy(src_addr, &res.ss, res.addrlen); - *addrlen = res.addrlen; - - return res.len; -} - -static ssize_t dpdk_write(int sock, const void *buf, size_t len) -{ - struct msg_send msg = { - .id = MSG_SEND, - .len = len, - .flags = 0, - .addrlen = 0, - }; - struct msg_result res; - struct iovec iov[2] = { - { - .iov_base = &msg, - .iov_len = sizeof(msg), - }, - { - .iov_base = (void *)buf, - .iov_len = len, - } - }; - - if (writev(sock, iov, 2) < 0) - return -1; - - if (read(sock, &res, sizeof(res)) != sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - return res.len; -} - -static ssize_t dpdk_sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) -{ - struct msg_send msg = { - .id = MSG_SEND, - .len = len, - .flags = flags, - .addrlen = addrlen, - }; - struct msg_result res; - struct iovec iov[3] = { - { - .iov_base = &msg, - .iov_len = sizeof(msg), - }, - { - .iov_base = (void *)dest_addr, - .iov_len = addrlen, - }, - { - .iov_base = (void *)buf, - .iov_len = len, - } - }; - - if (writev(sock, iov, 3) < 0) - return -1; - - if (read(sock, &res, sizeof(res)) != sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - return res.len; -} - -static int dpdk_set_nonblocking(int sock, int f) -{ - return 0; -} - -static int dpdk_setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen) -{ - return 0; -} - - -static int dpdk_ppp_open() -{ - int id = MSG_PPP_OPEN; - struct msg_result res; - int sock = socket(AF_UNIX, SOCK_DGRAM, 0); - - if (sock < 0) - return -1; - - if (connect(sock, (struct sockaddr *)&dpdk_addr, sizeof(dpdk_addr))) { - close(sock); - return -1; - } - - if (write(sock, &id, sizeof(id)) < 0) { - close(sock); - return -1; - } - - if (read(sock, &res, sizeof(res)) != sizeof(res)) { - close(sock); - errno = EBADE; - return -1; - } - - if (res.err) { - close(sock); - errno = res.err; - return -1; - } - - return sock; -} - -static int dpdk_ppp_ioctl(int fd, unsigned long request, void *arg) -{ - struct msg_ioctl msg = { - .id = MSG_PPP_IOCTL, - .request = request, - }; - struct msg_result res; - struct iovec iov[2] = { - { - .iov_base = &msg, - .iov_len = sizeof(msg), - }, - { - .iov_base = arg, - } - }; - - switch (request) { - case PPPIOCSNPMODE: - iov[1].iov_len = sizeof(struct npioctl); - break; - case PPPIOCSCOMPRESS: - iov[1].iov_len = sizeof(struct ppp_option_data); - break; - case PPPIOCGFLAGS: - case PPPIOCGCHAN: - case PPPIOCNEWUNIT: - iov[1].iov_len = 0; - break; - case PPPIOCSFLAGS: - case PPPIOCSMRU: - case PPPIOCATTCHAN: - case PPPIOCCONNECT: - iov[1].iov_len = sizeof(int); - break; - - } - - if (writev(fd, iov, iov[1].iov_len ? 2 : 1) < 0) - return -1; - - iov[0].iov_base = &res; - iov[0].iov_len = sizeof(res); - iov[1].iov_base = arg; - iov[1].iov_len = 1024; - - if (readv(fd, iov, 2) < sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - return res.len; -} - -static int dpdk_sock_ioctl(unsigned long request, void *arg) -{ - struct msg_ioctl msg = { - .id = MSG_SOCK_IOCTL, - .request = request, - }; - struct msg_result res; - struct iovec iov[2] = { - { - .iov_base = &msg, - .iov_len = sizeof(msg), - }, - { - .iov_base = arg, - .iov_len = sizeof(struct ifreq), - } - }; - - if (writev(dpdk_sock, iov, 2) < 0) - return -1; - - iov[0].iov_base = &res; - iov[0].iov_len = sizeof(res); - - if (readv(dpdk_sock, iov, 2) < sizeof(res)) { - errno = EBADE; - return -1; - } - - if (res.err) { - errno = res.err; - return -1; - } - - return res.len; -} - -static const struct ap_net dpdk_net = { - .socket = dpdk_socket, - .connect = dpdk_connect, - .bind = dpdk_bind, - .listen = dpdk_listen, - .read = dpdk_read, - .recvfrom = dpdk_recvfrom, - .write = dpdk_write, - .sendto = dpdk_sendto, - .set_nonblocking = dpdk_set_nonblocking, - .setsockopt = dpdk_setsockopt, - .ppp_open = dpdk_ppp_open, - .ppp_ioctl = dpdk_ppp_ioctl, - .sock_ioctl = dpdk_sock_ioctl, -}; - -static void init() -{ - const char *opt = conf_get_opt("net-dpdk", "socket"); - - if (!opt) - return; - - if (strlen(opt) >= sizeof(dpdk_addr.sun_path)) { - log_error("net-dpdk: socket path is too long\n"); - return; - } - - strcpy(dpdk_addr.sun_path, opt); - - dpdk_addr.sun_family = AF_UNIX; - - dpdk_sock = socket(AF_UNIX, SOCK_DGRAM, 0); - if (dpdk_sock < 0) - return; - - if (connect(dpdk_sock, (struct sockaddr *)&dpdk_addr, sizeof(dpdk_addr))) { - log_error("dpdk: connect: %s\n", strerror(errno)); - close(dpdk_sock); - return; - } -} - -DEFINE_INIT(1, init) diff --git a/accel-pppd/net/if_dp.h b/accel-pppd/net/if_dp.h new file mode 120000 index 00000000..32df37ad --- /dev/null +++ b/accel-pppd/net/if_dp.h @@ -0,0 +1 @@ +../../accel-dp/if_dp.h \ No newline at end of file diff --git a/accel-pppd/net/if_dpdk.h b/accel-pppd/net/if_dpdk.h deleted file mode 100644 index 4981dc9b..00000000 --- a/accel-pppd/net/if_dpdk.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef __IF_DPDK_H -#define __IF_DPDK_H - -#define MSG_SOCKET 1 -#define MSG_CONNECT 2 -#define MSG_BIND 3 -#define MSG_LISTEN 4 -#define MSG_RECV 5 -#define MSG_SEND 6 -#define MSG_PPP_OPEN 7 -#define MSG_PPP_IOCTL 8 -#define MSG_SOCK_IOCTL 9 -#define MSG_RESULT 10 - -struct msg_socket { - int id; - int domain; - int type; - int proto; -}; - -struct msg_connect { - int id; - socklen_t addrlen; - char addr[0]; -}; - -struct msg_bind { - int id; - socklen_t addrlen; - char addr[0]; -}; - -struct msg_listen { - int id; - int backlog; -}; - -struct msg_recv { - int id; - size_t len; - int flags; - socklen_t addrlen; -}; - -struct msg_send { - int id; - size_t len; - int flags; - socklen_t addrlen; -}; - -struct msg_ioctl { - int id; - unsigned long request; - char arg[0]; -}; - -struct msg_result { - int err; - ssize_t len; - socklen_t addrlen; - struct sockaddr_storage ss; -}; - -#endif - -- cgit v1.2.3