aboutsummaryrefslogtreecommitdiffstats
path: root/test/gtest/test_tle_udp_stream.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/gtest/test_tle_udp_stream.h')
-rw-r--r--test/gtest/test_tle_udp_stream.h200
1 files changed, 140 insertions, 60 deletions
diff --git a/test/gtest/test_tle_udp_stream.h b/test/gtest/test_tle_udp_stream.h
index d0256c3..582eaea 100644
--- a/test/gtest/test_tle_udp_stream.h
+++ b/test/gtest/test_tle_udp_stream.h
@@ -16,81 +16,88 @@
#ifndef TEST_TLE_UDP_STREAM_H_
#define TEST_TLE_UDP_STREAM_H_
#include <iostream>
+#include <algorithm>
+#include <string>
#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <rte_errno.h>
-#include <tle_udp_impl.h>
+#include <tle_udp.h>
#include <tle_event.h>
-int
-dummy_lookup4(void *opaque, const struct in_addr *addr,
- struct tle_udp_dest *res)
-{
- RTE_SET_USED(opaque);
- RTE_SET_USED(addr);
- RTE_SET_USED(res);
- return -ENOENT;
-}
+#include "test_common.h"
-int
-dummy_lookup6(void *opaque, const struct in6_addr *addr,
- struct tle_udp_dest *res)
-{
- RTE_SET_USED(opaque);
- RTE_SET_USED(addr);
- RTE_SET_USED(res);
- return -ENOENT;
-}
+#define MAX_STREAMS 0xFFFF
+#define MAX_STREAM_RBUFS 0x100
+#define MAX_STREAM_SBUFS 0x100
+#define RX_OFFLOAD 0x100
+#define TX_OFFLOAD 0x100
+
+using namespace std;
-struct tle_udp_ctx_param ctx_prm_tmpl = {
+struct tle_ctx_param ctx_prm_tmpl = {
.socket_id = SOCKET_ID_ANY,
- .max_streams = 0x10,
- .max_stream_rbufs = 0x100,
- .max_stream_sbufs = 0x100
+ .proto = TLE_PROTO_UDP,
+ .max_streams = MAX_STREAMS,
+ .max_stream_rbufs = MAX_STREAM_RBUFS,
+ .max_stream_sbufs = MAX_STREAM_SBUFS
};
-struct tle_udp_dev_param dev_prm_tmpl = {
- .rx_offload = 0x100,
- .tx_offload = 0x100
+struct tle_dev_param dev_prm_tmpl = {
+ .rx_offload = RX_OFFLOAD,
+ .tx_offload = TX_OFFLOAD
};
class test_tle_udp_stream: public ::testing::Test {
public:
- void setup_dev_prm(struct tle_udp_dev_param *,
+ void setup_dev_prm(struct tle_dev_param *,
char const *, char const *);
- struct tle_udp_ctx *setup_ctx(struct tle_udp_ctx_param *prm);
- struct tle_udp_dev *setup_dev(struct tle_udp_ctx *ctx,
- struct tle_udp_dev_param *dev_prm);
+ struct tle_ctx *setup_ctx(struct tle_ctx_param *prm);
+ struct tle_dev *setup_dev(struct tle_ctx *ctx,
+ struct tle_dev_param *dev_prm);
struct tle_evq *setup_event();
virtual void SetUp(void)
{
- char const *ipv4_laddr = "192.168.0.1";
- char const *ipv4_raddr = "192.168.0.2";
+ char const *ipv4_laddr = "192.0.0.1";
+ char const *ipv4_raddr = "10.0.0.1";
char const *ipv6 = "fe80::21e:67ff:fec2:2568";
- struct tle_udp_ctx_param cprm;
+ struct tle_ctx_param cprm;
+ port = 10000;
ctx = nullptr;
dev = nullptr;
stream = nullptr;
/* Setup Context */
cprm = ctx_prm_tmpl;
+ cprm.max_streams = 0xA;
cprm.lookup4 = dummy_lookup4;
cprm.lookup6 = dummy_lookup6;
ctx = setup_ctx(&cprm);
+ ASSERT_NE(ctx, nullptr);
+
/* Setup Dev */
memset(&dev_prm, 0, sizeof(dev_prm));
setup_dev_prm(&dev_prm, ipv4_laddr, ipv6);
dev = setup_dev(ctx, &dev_prm);
+ ASSERT_NE(dev, nullptr);
/* Stream Param & Event param */
memset(&stream_prm, 0, sizeof(struct tle_udp_stream_param));
- inet_pton(AF_INET, ipv4_laddr, &stream_prm.local_addr);
- inet_pton(AF_INET, ipv4_raddr, &stream_prm.remote_addr);
- stream_prm.local_addr.ss_family = AF_INET;
- stream_prm.remote_addr.ss_family = AF_INET;
+
+ ip4_addr = (struct sockaddr_in *) &stream_prm.local_addr;
+ ip4_addr->sin_family = AF_INET;
+ ip4_addr->sin_port = htons(port);
+ ip4_addr->sin_addr.s_addr = inet_addr(ipv4_laddr);
+
+ ip4_addr = (struct sockaddr_in *) &stream_prm.remote_addr;
+ ip4_addr->sin_family = AF_INET;
+ ip4_addr->sin_port = htons(port);
+ ip4_addr->sin_addr.s_addr = inet_addr(ipv4_raddr);
+
stream_prm.recv_ev = tle_event_alloc(setup_event(), nullptr);
stream_prm.send_ev = tle_event_alloc(setup_event(), nullptr);
}
@@ -98,22 +105,29 @@ public:
virtual void TearDown(void)
{
ret = 0;
- tle_udp_stream_close(stream);
- tle_udp_del_dev(dev);
- tle_udp_destroy(ctx);
+ for (auto s : streams)
+ tle_udp_stream_close(s);
+
+ tle_del_dev(dev);
+ tle_ctx_destroy(ctx);
}
int ret;
- struct tle_udp_ctx *ctx;
- struct tle_udp_dev *dev;
- struct tle_udp_stream *stream;
-
- struct tle_udp_ctx_param ctx_prm;
- struct tle_udp_dev_param dev_prm;
+ int port;
+ struct tle_ctx *ctx;
+ struct tle_dev *dev;
+ struct tle_stream *stream;
+ struct tle_ctx_param ctx_prm;
+ struct tle_dev_param dev_prm;
struct tle_udp_stream_param stream_prm;
+ struct sockaddr_in *ip4_addr;
+
+ vector<tle_stream *> streams;
};
-struct tle_evq *test_tle_udp_stream::setup_event() {
+struct tle_evq *
+test_tle_udp_stream::setup_event()
+{
int32_t socket_id;
uint32_t max_events;
struct tle_evq_param evq_params;
@@ -129,32 +143,98 @@ struct tle_evq *test_tle_udp_stream::setup_event() {
return evq;
}
-struct tle_udp_ctx
-*test_tle_udp_stream::setup_ctx(struct tle_udp_ctx_param *prm) {
- struct tle_udp_ctx *ctx;
+struct tle_ctx
+*test_tle_udp_stream::setup_ctx(struct tle_ctx_param *prm)
+{
+ struct tle_ctx *ctx;
- ctx = tle_udp_create(prm);
+ ctx = tle_ctx_create(prm);
return ctx;
}
-struct tle_udp_dev
-*test_tle_udp_stream::setup_dev(struct tle_udp_ctx *ctx,
- struct tle_udp_dev_param *dev_prm) {
-
- struct tle_udp_dev *dev;
+struct tle_dev
+*test_tle_udp_stream::setup_dev(struct tle_ctx *ctx,
+ struct tle_dev_param *dev_prm)
+{
+ struct tle_dev *dev;
- dev = tle_udp_add_dev(ctx, dev_prm);
+ dev = tle_add_dev(ctx, dev_prm);
return dev;
}
-void test_tle_udp_stream::setup_dev_prm(struct tle_udp_dev_param *dev_prm,
- char const *ipv4, char const *ipv6) {
-
+void
+test_tle_udp_stream::setup_dev_prm(struct tle_dev_param *dev_prm,
+ char const *ipv4, char const *ipv6)
+{
inet_pton(AF_INET, ipv4, &dev_prm->local_addr4);
inet_pton(AF_INET6, ipv6, &dev_prm->local_addr6);
}
+/* Fixture for max number of streams on single ctx + multiple devices */
+class test_tle_udp_stream_max: public ::test_tle_udp_stream {
+public:
+
+ virtual void SetUp(void)
+ {
+ /* Create enough devices and streams to exceed
+ * MAX_STREAMS on ctx
+ */
+ nb_devs = 10;
+ nb_streams = 6554;
+
+ in_addr_t src;
+ string ssrc;
+
+ memset(&ctx_prm, 0, sizeof(ctx_prm));
+ ctx_prm = ctx_prm_tmpl;
+ ctx_prm.lookup4 = dummy_lookup4;
+ ctx_prm.lookup6 = dummy_lookup6;
+ ctx = setup_ctx(&ctx_prm);
+ ASSERT_NE(ctx, (void *)NULL);
+
+ memset(&dev_prm, 0, sizeof(dev_prm));
+ setup_dev_prm(&dev_prm, base_l_ipv4, base_l_ipv6);
+
+ memset(&stream_prm, 0, sizeof(struct tle_udp_stream_param));
+ stream_prm.recv_ev = tle_event_alloc(setup_event(), nullptr);
+ stream_prm.send_ev = tle_event_alloc(setup_event(), nullptr);
+
+ for (i = 0; i < nb_devs; i++) {
+ ssrc = inet_ntoa(dev_prm.local_addr4);
+
+ dev = setup_dev(ctx, &dev_prm);
+ ASSERT_NE(dev, (void *)NULL);
+ devs.push_back(dev);
+
+ /* Modify base IP addresses for next loops */
+ src = dev_prm.local_addr4.s_addr;
+ src += 1;
+ dev_prm.local_addr4.s_addr = src;
+ }
+ }
+
+ virtual void TearDown(void)
+ {
+ for (auto s : streams)
+ tle_udp_stream_close(s);
+
+ for (auto d : devs)
+ tle_del_dev(d);
+
+ tle_ctx_destroy(ctx);
+ }
+
+ int i;
+ int nb_devs;
+ int nb_streams;
+ char const *base_l_ipv4 = "10.0.0.1";
+ char const *base_r_ipv4 = "190.0.0.1";
+ char const *base_l_ipv6 = "2000::1";
+ vector<tle_dev *> devs;
+ vector<tle_stream *> streams;
+};
+
#endif /* TEST_TLE_UDP_STREAM_H_ */