net: tcp2: tp: Simplify pkt creation in test protocol
Use existing network stack calls to create net pkt, ip header and udp header creation. Also simplify finalize api calls. Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
This commit is contained in:
parent
69551b4681
commit
b9d8884c25
4 changed files with 86 additions and 104 deletions
|
@ -1391,12 +1391,13 @@ enum net_verdict tp_input(struct net_conn *net_conn,
|
|||
responded = true;
|
||||
NET_DBG("tcp_send(\"%s\")", tp->data);
|
||||
{
|
||||
struct net_pkt *pkt = tcp_pkt_alloc(0);
|
||||
struct net_buf *nb =
|
||||
net_pkt_get_frag(pkt, K_NO_WAIT);
|
||||
memcpy(net_buf_add(nb, len), buf, len);
|
||||
net_pkt_frag_insert(pkt, nb);
|
||||
net_tcp_queue_data(conn->context, pkt);
|
||||
struct net_pkt *data_pkt;
|
||||
|
||||
data_pkt = tcp_pkt_alloc(pkt->iface,
|
||||
pkt->family, len);
|
||||
net_pkt_write(data_pkt, buf, len);
|
||||
net_pkt_cursor_init(data_pkt);
|
||||
net_tcp_queue_data(conn->context, data_pkt);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_NET_TEST_PROTOCOL)
|
||||
#define tcp_pkt_alloc(_len) tp_pkt_alloc(_len, tp_basename(__FILE__), __LINE__)
|
||||
#define tp_pkt_alloc(_pkt) tp_pkt_alloc(_pkt, tp_basename(__FILE__), __LINE__)
|
||||
#define tcp_pkt_clone(_pkt) tp_pkt_clone(_pkt, tp_basename(__FILE__), __LINE__)
|
||||
#define tcp_pkt_unref(_pkt) tp_pkt_unref(_pkt, tp_basename(__FILE__), __LINE__)
|
||||
#else
|
||||
|
|
|
@ -8,6 +8,9 @@
|
|||
#include <stdlib.h>
|
||||
#include "tp.h"
|
||||
#include "tp_priv.h"
|
||||
#include "ipv4.h"
|
||||
#include "ipv6.h"
|
||||
#include "udp_internal.h"
|
||||
|
||||
static sys_slist_t tp_mem = SYS_SLIST_STATIC_INIT(&tp_mem);
|
||||
static sys_slist_t tp_nbufs = SYS_SLIST_STATIC_INIT(&tp_nbufs);
|
||||
|
@ -212,39 +215,19 @@ void tp_nbuf_stat(void)
|
|||
}
|
||||
}
|
||||
|
||||
static struct net_pkt *tp_pkt_get(size_t len)
|
||||
void tp_pkt_alloc(struct net_pkt *pkt,
|
||||
const char *file, int line)
|
||||
{
|
||||
struct net_pkt *pkt = net_pkt_alloc(K_NO_WAIT);
|
||||
|
||||
pkt->family = AF_INET;
|
||||
|
||||
tp_assert(pkt, "");
|
||||
|
||||
if (len) {
|
||||
struct net_buf *buf = net_pkt_get_frag(pkt, K_NO_WAIT);
|
||||
|
||||
net_buf_add(buf, len);
|
||||
net_pkt_frag_insert(pkt, buf);
|
||||
tp_assert(buf, "");
|
||||
}
|
||||
|
||||
return pkt;
|
||||
}
|
||||
|
||||
struct net_pkt *tp_pkt_alloc(size_t len, const char *file, int line)
|
||||
{
|
||||
struct net_pkt *pkt = tp_pkt_get(len);
|
||||
struct tp_pkt *tp_pkt = k_malloc(sizeof(struct tp_pkt));
|
||||
|
||||
tp_assert(tp_pkt, "");
|
||||
tp_assert(pkt, "");
|
||||
|
||||
tp_pkt->pkt = pkt;
|
||||
tp_pkt->file = file;
|
||||
tp_pkt->line = line;
|
||||
|
||||
sys_slist_append(&tp_pkts, (sys_snode_t *) tp_pkt);
|
||||
|
||||
return pkt;
|
||||
}
|
||||
|
||||
struct net_pkt *tp_pkt_clone(struct net_pkt *pkt, const char *file, int line)
|
||||
|
@ -368,73 +351,46 @@ out:
|
|||
return type;
|
||||
}
|
||||
|
||||
static void ip_header_add(struct net_pkt *pkt)
|
||||
static void udp_finalize_pkt(struct net_pkt *pkt)
|
||||
{
|
||||
struct net_buf *buf = net_pkt_get_frag(pkt, K_NO_WAIT);
|
||||
int ret = 0;
|
||||
|
||||
switch (pkt->family) {
|
||||
case AF_INET: {
|
||||
struct net_ipv4_hdr ip;
|
||||
net_pkt_cursor_init(pkt);
|
||||
|
||||
memset(&ip, 0, sizeof(ip));
|
||||
|
||||
ip.vhl = 0x45;
|
||||
ip.ttl = 64;
|
||||
ip.proto = IPPROTO_UDP;
|
||||
ip.len = htons(net_pkt_get_len(pkt) + sizeof(ip));
|
||||
|
||||
net_addr_pton(AF_INET, CONFIG_NET_CONFIG_MY_IPV4_ADDR,
|
||||
&ip.src);
|
||||
net_addr_pton(AF_INET, CONFIG_NET_CONFIG_PEER_IPV4_ADDR,
|
||||
&ip.dst);
|
||||
memcpy(net_buf_add(buf, sizeof(ip)), &ip, sizeof(ip));
|
||||
|
||||
net_pkt_frag_insert(pkt, buf);
|
||||
|
||||
net_pkt_set_ip_hdr_len(pkt, buf->len);
|
||||
|
||||
break;
|
||||
if (IS_ENABLED(CONFIG_NET_IPV4) && net_pkt_family(pkt) == AF_INET) {
|
||||
ret = net_ipv4_finalize(pkt, IPPROTO_UDP);
|
||||
}
|
||||
case AF_INET6: {
|
||||
struct net_ipv6_hdr ip6;
|
||||
|
||||
memset(&ip6, 0, sizeof(ip6));
|
||||
|
||||
ip6.vtc = 0x60;
|
||||
ip6.nexthdr = IPPROTO_UDP;
|
||||
ip6.len = htons(net_pkt_get_len(pkt));
|
||||
|
||||
net_addr_pton(AF_INET6, CONFIG_NET_CONFIG_MY_IPV6_ADDR,
|
||||
&ip6.src);
|
||||
net_addr_pton(AF_INET6, CONFIG_NET_CONFIG_PEER_IPV6_ADDR,
|
||||
&ip6.dst);
|
||||
|
||||
memcpy(net_buf_add(buf, sizeof(ip6)), &ip6, sizeof(ip6));
|
||||
|
||||
net_pkt_frag_insert(pkt, buf);
|
||||
|
||||
net_pkt_set_ip_hdr_len(pkt, buf->len);
|
||||
|
||||
break;
|
||||
}
|
||||
if (IS_ENABLED(CONFIG_NET_IPV6) && net_pkt_family(pkt) == AF_INET6) {
|
||||
ret = net_ipv6_finalize(pkt, IPPROTO_UDP);
|
||||
}
|
||||
|
||||
NET_ASSERT(ret == 0);
|
||||
}
|
||||
|
||||
static void udp_header_add(struct net_pkt *pkt)
|
||||
static int ip_header_add(struct net_pkt *pkt)
|
||||
{
|
||||
struct net_buf *buf = net_pkt_get_frag(pkt, K_NO_WAIT);
|
||||
if (IS_ENABLED(CONFIG_NET_IPV4) && net_pkt_family(pkt) == AF_INET) {
|
||||
struct in_addr src;
|
||||
struct in_addr dst;
|
||||
|
||||
struct net_udp_hdr uh;
|
||||
net_addr_pton(AF_INET, CONFIG_NET_CONFIG_MY_IPV4_ADDR, &src);
|
||||
net_addr_pton(AF_INET, CONFIG_NET_CONFIG_PEER_IPV4_ADDR, &dst);
|
||||
|
||||
memset(&uh, 0, sizeof(uh));
|
||||
return net_ipv4_create(pkt, &src, &dst);
|
||||
}
|
||||
|
||||
uh.src_port = htons(4242);
|
||||
uh.dst_port = htons(4242);
|
||||
uh.len = htons(sizeof(uh) + net_pkt_get_len(pkt));
|
||||
if (IS_ENABLED(CONFIG_NET_IPV6) && net_pkt_family(pkt) == AF_INET6) {
|
||||
struct in6_addr src;
|
||||
struct in6_addr dst;
|
||||
|
||||
memcpy(net_buf_add(buf, sizeof(uh)), &uh, sizeof(uh));
|
||||
net_addr_pton(AF_INET6, CONFIG_NET_CONFIG_MY_IPV6_ADDR, &src);
|
||||
net_addr_pton(AF_INET6, CONFIG_NET_CONFIG_PEER_IPV6_ADDR, &dst);
|
||||
|
||||
net_pkt_frag_insert(pkt, buf);
|
||||
return net_ipv6_create(pkt, &src, &dst);
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void tp_pkt_send(struct net_pkt *pkt)
|
||||
|
@ -448,35 +404,59 @@ static void tp_pkt_send(struct net_pkt *pkt)
|
|||
tp_pkt_unref(pkt, tp_basename(__FILE__), __LINE__);
|
||||
}
|
||||
|
||||
static struct net_pkt *tp_output_pkt_alloc(sa_family_t af,
|
||||
struct net_if *iface,
|
||||
size_t len,
|
||||
const char *file, int line)
|
||||
{
|
||||
struct tp_pkt *tp_pkt = k_malloc(sizeof(struct tp_pkt));
|
||||
|
||||
tp_assert(tp_pkt, "");
|
||||
|
||||
tp_pkt->pkt = net_pkt_alloc_with_buffer(iface,
|
||||
sizeof(struct net_udp_hdr) + len,
|
||||
af, IPPROTO_UDP, K_NO_WAIT);
|
||||
tp_assert(tp_pkt->pkt, "");
|
||||
|
||||
tp_pkt->file = file;
|
||||
tp_pkt->line = line;
|
||||
|
||||
sys_slist_append(&tp_pkts, (sys_snode_t *) tp_pkt);
|
||||
|
||||
return tp_pkt->pkt;
|
||||
}
|
||||
|
||||
void _tp_output(sa_family_t af, struct net_if *iface, void *data,
|
||||
size_t data_len, const char *file, int line)
|
||||
{
|
||||
struct net_pkt *pkt = tp_pkt_alloc(0, file, line);
|
||||
size_t total = data_len, len;
|
||||
struct net_buf *buf;
|
||||
struct net_pkt *pkt = tp_output_pkt_alloc(af, iface, data_len,
|
||||
file, line);
|
||||
int ret;
|
||||
|
||||
pkt->family = af;
|
||||
|
||||
for ( ; total; total -= len, data = (u8_t *)data + len) {
|
||||
|
||||
buf = net_pkt_get_frag(pkt, K_NO_WAIT);
|
||||
|
||||
len = MIN(buf->size, total);
|
||||
|
||||
memcpy(net_buf_add(buf, len), data, len);
|
||||
|
||||
net_pkt_frag_add(pkt, buf);
|
||||
ret = ip_header_add(pkt);
|
||||
if (ret < 0) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
udp_header_add(pkt);
|
||||
ret = net_udp_create(pkt, htons(4242), htons(4242));
|
||||
if (ret < 0) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ip_header_add(pkt);
|
||||
ret = net_pkt_write(pkt, data, data_len);
|
||||
if (ret < 0) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
pkt->iface = iface;
|
||||
udp_finalize_pkt(pkt);
|
||||
|
||||
NET_ASSERT(net_pkt_get_len(pkt) <= net_if_get_mtu(pkt->iface));
|
||||
|
||||
tp_pkt_send(pkt);
|
||||
|
||||
return;
|
||||
fail:
|
||||
NET_ASSERT(false);
|
||||
}
|
||||
|
||||
struct tp *json_to_tp(void *data, size_t data_len)
|
||||
|
|
|
@ -118,9 +118,9 @@ size_t tp_str_to_hex(void *buf, size_t bufsize, const char *s);
|
|||
|
||||
void _tp_output(sa_family_t af, struct net_if *iface, void *data,
|
||||
size_t data_len, const char *file, int line);
|
||||
#define tp_output(_af, _iface, _data, _data_len) \
|
||||
_tp_output(_af, _iface, _data, _data_len, tp_basename(__FILE__),\
|
||||
__LINE__)
|
||||
#define tp_output(_af, _iface, _data, _data_len) \
|
||||
_tp_output(_af, _iface, _data, _data_len, \
|
||||
tp_basename(__FILE__), __LINE__)
|
||||
|
||||
void tp_pkt_adj(struct net_pkt *pkt, int req_len);
|
||||
|
||||
|
@ -139,8 +139,9 @@ struct net_buf *tp_nbuf_clone(struct net_buf *buf, const char *file, int line,
|
|||
void tp_nbuf_unref(struct net_buf *nbuf, const char *file, int line,
|
||||
const char *func);
|
||||
void tp_nbuf_stat(void);
|
||||
void tp_pkt_alloc(struct net_pkt *pkt,
|
||||
const char *file, int line);
|
||||
|
||||
struct net_pkt *tp_pkt_alloc(size_t len, const char *file, int line);
|
||||
struct net_pkt *tp_pkt_clone(struct net_pkt *pkt, const char *file, int line);
|
||||
void tp_pkt_unref(struct net_pkt *pkt, const char *file, int line);
|
||||
void tp_pkt_stat(void);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue