net: tcp2: Use net_tcp_finalize() for checksum calculation
In order to support IPv6, use net_tcp_finalize() for checksum calculation. Signed-off-by: Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>
This commit is contained in:
parent
9292ce9efc
commit
e301397af1
1 changed files with 2 additions and 51 deletions
|
@ -34,6 +34,7 @@ NET_BUF_POOL_DEFINE(tcp_nbufs, 64/*count*/, CONFIG_NET_BUF_DATA_SIZE, 0, NULL);
|
||||||
|
|
||||||
static void tcp_in(struct tcp *conn, struct net_pkt *pkt);
|
static void tcp_in(struct tcp *conn, struct net_pkt *pkt);
|
||||||
static size_t tcp_data_len(struct net_pkt *pkt);
|
static size_t tcp_data_len(struct net_pkt *pkt);
|
||||||
|
int net_tcp_finalize(struct net_pkt *pkt);
|
||||||
|
|
||||||
int (*tcp_send_cb)(struct net_pkt *pkt) = NULL;
|
int (*tcp_send_cb)(struct net_pkt *pkt) = NULL;
|
||||||
|
|
||||||
|
@ -687,56 +688,6 @@ static struct net_pkt *tcp_pkt_make(struct tcp *conn, u8_t flags)
|
||||||
return pkt;
|
return pkt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32_t sum(void *data, size_t len)
|
|
||||||
{
|
|
||||||
u32_t s = 0;
|
|
||||||
|
|
||||||
for ( ; len > 1; len -= 2, data = (u8_t *)data + 2) {
|
|
||||||
s += *((u16_t *)data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len) {
|
|
||||||
s += *((u8_t *)data);
|
|
||||||
}
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint16_t cs(int32_t s)
|
|
||||||
{
|
|
||||||
return ~((s & 0xFFFF) + (s >> 16));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void tcp_csum(struct net_pkt *pkt)
|
|
||||||
{
|
|
||||||
struct net_ipv4_hdr *ip = ip_get(pkt);
|
|
||||||
struct tcphdr *th = (void *)(ip + 1);
|
|
||||||
struct net_buf *buf = pkt->frags;
|
|
||||||
size_t hlen = sizeof(struct net_ipv4_hdr);
|
|
||||||
u16_t len = ntohs(ip->len) - hlen;
|
|
||||||
u32_t s;
|
|
||||||
int i, j = 0;
|
|
||||||
|
|
||||||
ip->chksum = cs(sum(ip, sizeof(*ip)));
|
|
||||||
|
|
||||||
s = sum(&ip->src, sizeof(struct in_addr) * 2);
|
|
||||||
s += ntohs(ip->proto + len);
|
|
||||||
|
|
||||||
th->th_sum = 0;
|
|
||||||
|
|
||||||
s += sum(th, buf->len - hlen);
|
|
||||||
|
|
||||||
SYS_SLIST_FOR_EACH_CONTAINER((sys_slist_t *)&buf->node, buf, node) {
|
|
||||||
|
|
||||||
for (i = 0; i < buf->len; i++, j++) {
|
|
||||||
|
|
||||||
s += (j % 2) ? buf->data[i] << 8 : buf->data[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
th->th_sum = cs(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void tcp_chain_free(struct net_buf *head)
|
static void tcp_chain_free(struct net_buf *head)
|
||||||
{
|
{
|
||||||
struct net_buf *next;
|
struct net_buf *next;
|
||||||
|
@ -787,7 +738,7 @@ static void tcp_out(struct tcp *conn, u8_t flags, ...)
|
||||||
|
|
||||||
ip_header_add(conn, pkt);
|
ip_header_add(conn, pkt);
|
||||||
|
|
||||||
tcp_csum(pkt);
|
net_tcp_finalize(pkt);
|
||||||
|
|
||||||
NET_DBG("%s", tcp_th(pkt));
|
NET_DBG("%s", tcp_th(pkt));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue