bpf: Make SOCK_OPS_GET_TCP size independent
authorLawrence Brakmo <brakmo@fb.com>
Fri, 26 Jan 2018 00:14:06 +0000 (16:14 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 26 Jan 2018 00:41:13 +0000 (16:41 -0800)
Make SOCK_OPS_GET_TCP helper macro size independent (before only worked
with 4-byte fields.

Signed-off-by: Lawrence Brakmo <brakmo@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
net/core/filter.c

index bf9bb755e369cf6be8cf077d8b5862c9ee7298b9..62e78748d95f66e2c695b0c145b1a1900656cb71 100644 (file)
@@ -4470,9 +4470,10 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type,
                break;
 
 /* Helper macro for adding read access to tcp_sock fields. */
-#define SOCK_OPS_GET_TCP32(FIELD_NAME)                                       \
+#define SOCK_OPS_GET_TCP(FIELD_NAME)                                         \
        do {                                                                  \
-               BUILD_BUG_ON(FIELD_SIZEOF(struct tcp_sock, FIELD_NAME) != 4); \
+               BUILD_BUG_ON(FIELD_SIZEOF(struct tcp_sock, FIELD_NAME) >      \
+                            FIELD_SIZEOF(struct bpf_sock_ops, FIELD_NAME));  \
                *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(                       \
                                                struct bpf_sock_ops_kern,     \
                                                is_fullsock),                 \
@@ -4484,16 +4485,18 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type,
                                                struct bpf_sock_ops_kern, sk),\
                                      si->dst_reg, si->src_reg,               \
                                      offsetof(struct bpf_sock_ops_kern, sk));\
-               *insn++ = BPF_LDX_MEM(BPF_W, si->dst_reg, si->dst_reg,        \
+               *insn++ = BPF_LDX_MEM(FIELD_SIZEOF(struct tcp_sock,           \
+                                                  FIELD_NAME), si->dst_reg,  \
+                                     si->dst_reg,                            \
                                      offsetof(struct tcp_sock, FIELD_NAME)); \
        } while (0)
 
        case offsetof(struct bpf_sock_ops, snd_cwnd):
-               SOCK_OPS_GET_TCP32(snd_cwnd);
+               SOCK_OPS_GET_TCP(snd_cwnd);
                break;
 
        case offsetof(struct bpf_sock_ops, srtt_us):
-               SOCK_OPS_GET_TCP32(srtt_us);
+               SOCK_OPS_GET_TCP(srtt_us);
                break;
        }
        return insn - insn_buf;