Fixes: ping works now
diff --git a/include/uapi/linux/ip.h b/include/uapi/linux/ip.h index 9ef9ccf..34851d4 100644 --- a/include/uapi/linux/ip.h +++ b/include/uapi/linux/ip.h
@@ -144,7 +144,8 @@ struct ip_eesp_hdr { }; struct ip_eesp_peer_hdr { - __be64 seq_no; + __be32 seq_hi; + __be32 seq_no; __be64 iv; };
diff --git a/net/xfrm/xfrm_eesp.c b/net/xfrm/xfrm_eesp.c index 1b09fed..64ddf65 100644 --- a/net/xfrm/xfrm_eesp.c +++ b/net/xfrm/xfrm_eesp.c
@@ -490,6 +490,7 @@ int eesp_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct eesp_info memcpy(iv + ivlen - min(ivlen, 8), (u8 *)&eesp_ph->iv + 8 - min(ivlen, 8), min(ivlen, 8)); + skb_dump(KERN_WARNING, skb, true); EESP_SKB_CB(skb)->tmp = tmp; err = crypto_aead_encrypt(req); printk("crypto_aead_encrypt err %d\n", err); @@ -512,6 +513,7 @@ int eesp_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct eesp_info if (!err && x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP) err = eesp_output_tail_tcp(x, skb); + printk("eesp_output: eesp_ph->iv 0x%lld\n", be64_to_cpu(eesp_ph->iv)); error_free: kfree(tmp); error: @@ -552,8 +554,10 @@ int eesp_output(struct xfrm_state *x, struct sk_buff *skb) return eesp.nfrags; eesph = eesp.eesph; - eesp_ph = (struct ip_eesp_peer_hdr *)eesph + sizeof(struct ip_eesp_hdr); - eesp_pyldh = (struct ip_eesp_pyld_hdr *)eesp_ph + sizeof(struct ip_eesp_peer_hdr); + eesp_ph = (void *)eesph + sizeof(struct ip_eesp_hdr); +// eesp_ph = (struct ip_eesp_peer_hdr *)eesph + sizeof(struct ip_eesp_hdr); + eesp_pyldh = (void *)eesp_ph + sizeof(struct ip_eesp_peer_hdr); +// eesp_pyldh = (struct ip_eesp_pyld_hdr *)eesp_ph + sizeof(struct ip_eesp_peer_hdr); /* EESP base header */ eesph->one = 1; @@ -563,10 +567,14 @@ int eesp_output(struct xfrm_state *x, struct sk_buff *skb) eesph->spi = x->id.spi; /* EESP peer header */ - eesp_ph->seq_no = cpu_to_be64(XFRM_SKB_CB(skb)->seq.output.low + - ((u64)XFRM_SKB_CB(skb)->seq.output.hi << 32)); + eesp_ph->seq_no = cpu_to_be32(XFRM_SKB_CB(skb)->seq.output.low); + eesp_ph->seq_hi = cpu_to_be32(XFRM_SKB_CB(skb)->seq.output.hi); + /* EESP peer header: IV is inserted from the crypto layer */ + printk("eesp_output: eesp->spi 0x%x\n", eesph->spi); + printk("eesp_output: eesp_ph->seq_no %d\n", be32_to_cpu(eesp_ph->seq_no)); + printk("eesp_output: eesp_ph->seq_hi %d\n", be32_to_cpu(eesp_ph->seq_hi)); /* EESP payload header */ eesp_pyldh->zero = 0; eesp_pyldh->reserved1 = 0; @@ -574,7 +582,7 @@ int eesp_output(struct xfrm_state *x, struct sk_buff *skb) eesp_pyldh->nexthdr = eesp.proto; eesp_pyldh->padlen = eesp.plen; - eesp.seqno = eesp_ph->seq_no; +// eesp.seqno = eesp_ph->seq_no; skb_push(skb, -skb_network_offset(skb)); @@ -593,18 +601,38 @@ static inline int eesp_remove_trailer(struct sk_buff *skb) __wsum csumdiff; u8 nexthdr; int ret; + u8 reserved1, reserved2, zero; + struct ip_eesp_peer_hdr *eesp_ph; alen = crypto_aead_authsize(aead); hlen = sizeof(struct ip_eesp_hdr) + sizeof(struct ip_eesp_peer_hdr); elen = skb->len - hlen; +// skb_reset_transport_header(skb); eesph = ip_eesp_hdr(skb); - eesp_pyldh = (struct ip_eesp_pyld_hdr *)eesph + hlen; + +// eesph = (void *)(skb_network_header(skb) + skb_network_header_len(skb)); + eesp_ph = (void *)eesph + sizeof(struct ip_eesp_hdr); + eesp_pyldh = (void *)eesph + hlen; padlen = eesp_pyldh->padlen; nexthdr = eesp_pyldh->nexthdr; + zero = eesp_pyldh->zero; + reserved1 = eesp_pyldh->reserved1; + reserved2 = eesp_pyldh->reserved2; + printk("eesp_remove_trailer: zero 0x%x, reserved1, 0x%x, reserved2 0x%x\n", zero, reserved1, reserved2); + printk("eesp_remove_trailer: padlen 0x%x, nexthdr 0x%x\n", padlen, nexthdr); + printk("eesp_remove_trailer: spi 0x%x\n", eesph->spi); + printk("eesp_remove_trailer: eesp_ph->seq_no 0x%x\n", be32_to_cpu(eesp_ph->seq_no)); + printk("eesp_remove_trailer: eesp_ph->seq_hi 0x%x\n", be32_to_cpu(eesp_ph->seq_hi)); + printk("eesp_remove_trailer: eesp_ph->iv 0x%llx\n", be64_to_cpu(eesp_ph->iv)); +// printk("eesp_remove_trailer: eesp_ph->iv 0x%lld\n", be64_to_cpu(eesp_ph->iv)); + + + + skb_dump(KERN_WARNING, skb, true); ret = -EINVAL; if (padlen + alen >= elen) {
diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c index 519fd0b..fe36b47 100644 --- a/net/xfrm/xfrm_input.c +++ b/net/xfrm/xfrm_input.c
@@ -635,6 +635,9 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) goto drop_unlock; } + seq_hi = htonl(xfrm_replay_seqhi(x, seq)); + printk("xfrm_input: spi 0x%x seq %d seq_hi %d\n", spi, seq, seq_hi); + if (xfrm_replay_check(x, skb, seq)) { XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR); goto drop_unlock;