From 3395610ea65d66fb96ab98d6915a7ffbd584c34e Mon Sep 17 00:00:00 2001 From: Konstantin Ananyev Date: Fri, 3 Jun 2016 16:43:13 +0100 Subject: Initial commit of tldk code. Change-Id: Ib96fdd2c57bae0a51ed420137c35eb8e2ee58473 Signed-off-by: Konstantin Ananyev Signed-off-by: Ed Warnicke --- lib/libtle_udp/udp_impl.h | 161 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 lib/libtle_udp/udp_impl.h (limited to 'lib/libtle_udp/udp_impl.h') diff --git a/lib/libtle_udp/udp_impl.h b/lib/libtle_udp/udp_impl.h new file mode 100644 index 0000000..fbdb743 --- /dev/null +++ b/lib/libtle_udp/udp_impl.h @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2016 Intel Corporation. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _UDP_IMPL_H_ +#define _UDP_IMPL_H_ + +#include +#include +#include +#include + +#include "buf_cage.h" +#include "port_bitmap.h" +#include "osdep.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + TLE_UDP_V4, + TLE_UDP_V6, + TLE_UDP_VNUM +}; + +union udp_ports { + uint32_t raw; + struct { + uint16_t src; + uint16_t dst; + }; +}; + +union udph { + uint64_t raw; + struct { + union udp_ports ports; + uint16_t len; + uint16_t cksum; + }; +}; + +union ipv4_addrs { + uint64_t raw; + struct { + uint32_t src; + uint32_t dst; + }; +}; + +union ipv6_addrs { + _ymm_t raw; + struct { + rte_xmm_t src; + rte_xmm_t dst; + }; +}; + +union ip_addrs { + union ipv4_addrs v4; + union ipv6_addrs v6; +}; + + +struct tle_udp_stream { + + STAILQ_ENTRY(tle_udp_stream) link; + struct tle_udp_ctx *ctx; + + uint8_t type; /* TLE_UDP_V4 or TLE_UDP_V6 */ + + struct { + struct rte_ring *q; + struct tle_event *ev; + struct tle_udp_stream_cb cb; + rte_atomic32_t use; + } rx; + + union udp_ports port; + union udp_ports pmsk; + + union { + struct { + union ipv4_addrs addr; + union ipv4_addrs mask; + } ipv4; + struct { + union ipv6_addrs addr; + union ipv6_addrs mask; + } ipv6; + }; + + struct { + rte_atomic32_t use; + rte_spinlock_t lock; + struct tle_event *ev; + struct tle_udp_stream_cb cb; + struct bcg_store *st; + struct buf_cage *cg[RTE_MAX_ETHPORTS]; + } tx __rte_cache_aligned; + + struct tle_udp_stream_param prm; +} __rte_cache_aligned; + +struct tle_udp_dport { + struct udp_pbm use; /* ports in use. */ + struct tle_udp_stream *streams[MAX_PORT_NUM]; /* port to stream. */ +}; + +struct tle_udp_dev { + struct tle_udp_ctx *ctx; + struct { + uint64_t ol_flags[TLE_UDP_VNUM]; + } rx; + struct { + /* used by FE. */ + uint64_t ol_flags[TLE_UDP_VNUM]; + rte_atomic32_t packet_id[TLE_UDP_VNUM]; + struct bcg_queue feq; + + /* used by BE only. */ + struct bcg_queue beq __rte_cache_min_aligned; + struct buf_cage *bc; + } tx; + struct tle_udp_dev_param prm; /* copy of device paramaters. */ + struct tle_udp_dport *dp[TLE_UDP_VNUM]; /* device udp ports */ +}; + +struct tle_udp_ctx { + struct tle_udp_ctx_param prm; + + struct { + rte_spinlock_t lock; + uint32_t nb_free; /* number of free streams. */ + STAILQ_HEAD(, tle_udp_stream) free; + struct tle_udp_stream *buf; /* array of streams */ + } streams; + + rte_spinlock_t dev_lock; + uint32_t nb_dev; + struct udp_pbm use[TLE_UDP_VNUM]; /* all ports in use. */ + struct tle_udp_dev dev[RTE_MAX_ETHPORTS]; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* _UDP_IMPL_H_ */ -- cgit 1.2.3-korg