bpf: fix _htons occurences in test_progs
Dave reported that on sparc test_progs generates buggy swapped eth->h_proto protocol comparisons: 10: (15) if r3 == 0xdd86 goto pc+9 R0=imm2,min_value=2,max_value=2 R1=pkt(id=0,off=0,r=14) R2=pkt_end R3=inv R4=pkt(id=0,off=14,r=14) R5=inv56 R10=fp This is due to the unconditional ... #define htons __builtin_bswap16 #define ntohs __builtin_bswap16 ... in test_progs that causes this. Make use of asm/byteorder.h and use __constant_htons() where possible and only perform the bswap16 when on little endian in non-constant case. Fixes:6882804c91
("selftests/bpf: add a test for overlapping packet range checks") Fixes:3782161362
("selftests/bpf: add l4 load balancer test based on sched_cls") Reported-by: David S. Miller <davem@davemloft.net> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
d24f7c7fb9
commit
43bcf707cc
@@ -19,9 +19,8 @@
|
||||
#include <linux/udp.h>
|
||||
#include "bpf_helpers.h"
|
||||
#include "test_iptunnel_common.h"
|
||||
#include "bpf_util.h"
|
||||
|
||||
#define htons __builtin_bswap16
|
||||
#define ntohs __builtin_bswap16
|
||||
int _version SEC("version") = 1;
|
||||
|
||||
static inline __u32 rol32(__u32 word, unsigned int shift)
|
||||
@@ -355,7 +354,7 @@ static __always_inline int process_packet(void *data, __u64 off, void *data_end,
|
||||
iph_len = sizeof(struct ipv6hdr);
|
||||
protocol = ip6h->nexthdr;
|
||||
pckt.proto = protocol;
|
||||
pkt_bytes = ntohs(ip6h->payload_len);
|
||||
pkt_bytes = bpf_ntohs(ip6h->payload_len);
|
||||
off += iph_len;
|
||||
if (protocol == IPPROTO_FRAGMENT) {
|
||||
return TC_ACT_SHOT;
|
||||
@@ -377,7 +376,7 @@ static __always_inline int process_packet(void *data, __u64 off, void *data_end,
|
||||
|
||||
protocol = iph->protocol;
|
||||
pckt.proto = protocol;
|
||||
pkt_bytes = ntohs(iph->tot_len);
|
||||
pkt_bytes = bpf_ntohs(iph->tot_len);
|
||||
off += IPV4_HDR_LEN_NO_OPT;
|
||||
|
||||
if (iph->frag_off & PCKT_FRAGMENTED)
|
||||
@@ -464,9 +463,9 @@ int balancer_ingress(struct __sk_buff *ctx)
|
||||
if (data + nh_off > data_end)
|
||||
return TC_ACT_SHOT;
|
||||
eth_proto = eth->eth_proto;
|
||||
if (eth_proto == htons(ETH_P_IP))
|
||||
if (eth_proto == bpf_htons(ETH_P_IP))
|
||||
return process_packet(data, nh_off, data_end, false, ctx);
|
||||
else if (eth_proto == htons(ETH_P_IPV6))
|
||||
else if (eth_proto == bpf_htons(ETH_P_IPV6))
|
||||
return process_packet(data, nh_off, data_end, true, ctx);
|
||||
else
|
||||
return TC_ACT_SHOT;
|
||||
|
Reference in New Issue
Block a user