From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.mhcomputing.net (master.mhcomputing.net [74.208.46.186]) by dpdk.org (Postfix) with ESMTP id 8E249B533 for ; Sun, 22 Feb 2015 01:38:48 +0100 (CET) Received: from [192.168.1.77] (99-34-229-174.lightspeed.sntcca.sbcglobal.net [99.34.229.174]) by mail.mhcomputing.net (Postfix) with ESMTPSA id 0FA4580C000 for ; Sat, 21 Feb 2015 16:38:12 -0800 (PST) From: Matthew Hall Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Message-Id: <3ABAA9DB-3F71-44D4-9C46-22933F9F30F0@mhcomputing.net> Date: Sat, 21 Feb 2015 16:38:45 -0800 To: "" Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) X-Mailer: Apple Mail (2.1878.6) Subject: [dpdk-dev] Appropriate DPDK data structures for TCP sockets X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Feb 2015 00:38:48 -0000 Hello fellow stack hackers :) , I'm working on a simple server-side implementation of TCP on DPDK. For this to work I need a good data structure to store some sockets. The lookup key is like this: struct ss_flow_key_s { uint8_t sip[IPV6_ALEN]; uint8_t dip[IPV6_ALEN]; uint16_t sport; uint16_t dport; uint8_t protocol; } __attribute__((packed)); typedef struct ss_flow_key_s ss_flow_key_t; The socket itself is like this: enum ss_tcp_state_e { SS_TCP_CLOSED =3D 0, SS_TCP_LISTEN =3D 1, SS_TCP_SYN_TX =3D 2, SS_TCP_SYN_RX =3D 3, SS_TCP_OPEN =3D 4, SS_TCP_UNKNOWN =3D = -1, }; typedef enum ss_tcp_state_e ss_tcp_state_t; // RFC 793, RFC 1122 struct ss_tcp_socket_s { ss_flow_key_t key; uint32_t id; rte_spinlock_t lock; ss_tcp_state_t state; uint32_t ticks_last; uint16_t rx_buf_offset; uint16_t mss; uint64_t rx_failures; uint8_t rx_data[L4_TCP_WINDOW_SIZE * 2]; } __rte_cache_aligned; So far I was using rte_hash, but it's single writer multi reader, which = is eventually going to need some more complicated locking and probably = run kind of slow. Also, I need some timer functions to delete dead = sockets and so forth, and rte_hash doesn't have any iteration API. So then I was trying to figure out if I needed to use a linked list for = the iteration or if there is some other API I should use instead like = rte_table_*. However the documentation of rte_table is kind of confusing = so I wasn't sure if that was the right choice either. Any advice? Thanks, Matthew.=