Changed SOCK_OPS_GET_TCP to SOCK_OPS_GET_FIELD and added a new
argument so now it can also work with struct sock fields.

Previous: SOCK_OPS_GET_TCP(FIELD_NAME)
New:      SOCK_OPS_GET_FIELD(FIELD_NAME, OBJ)

Where OBJ is either "struct tcp_sock" or "struct sock" (without
quotation). Assumes FIELD_NAME is a field in the struct
bpf_sock_ops and in the OBJ specified.

Signed-off-by: Lawrence Brakmo <bra...@fb.com>
---
 net/core/filter.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/net/core/filter.c b/net/core/filter.c
index d47d126..f808269 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -4447,10 +4447,10 @@ static u32 sock_ops_convert_ctx_access(enum 
bpf_access_type type,
                                               is_fullsock));
                break;
 
-/* Helper macro for adding read access to tcp_sock fields. */
-#define SOCK_OPS_GET_TCP(FIELD_NAME)                                         \
+/* Helper macro for adding read access to tcp_sock or sock fields. */
+#define SOCK_OPS_GET_FIELD(FIELD_NAME, OBJ)                                  \
        do {                                                                  \
-               BUILD_BUG_ON(FIELD_SIZEOF(struct tcp_sock, FIELD_NAME) >      \
+               BUILD_BUG_ON(FIELD_SIZEOF(OBJ, FIELD_NAME) >                  \
                             FIELD_SIZEOF(struct bpf_sock_ops, FIELD_NAME));  \
                *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(                       \
                                                struct bpf_sock_ops_kern,     \
@@ -4463,18 +4463,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(FIELD_SIZEOF(struct tcp_sock,           \
-                                                  FIELD_NAME), si->dst_reg,  \
-                                     si->dst_reg,                            \
-                                     offsetof(struct tcp_sock, FIELD_NAME)); \
+               *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(OBJ,                   \
+                                                      FIELD_NAME),           \
+                                     si->dst_reg, si->dst_reg,               \
+                                     offsetof(OBJ, FIELD_NAME));             \
        } while (0)
 
        case offsetof(struct bpf_sock_ops, snd_cwnd):
-               SOCK_OPS_GET_TCP(snd_cwnd);
+               SOCK_OPS_GET_FIELD(snd_cwnd, struct tcp_sock);
                break;
 
        case offsetof(struct bpf_sock_ops, srtt_us):
-               SOCK_OPS_GET_TCP(srtt_us);
+               SOCK_OPS_GET_FIELD(srtt_us, struct tcp_sock);
                break;
        }
        return insn - insn_buf;
-- 
2.9.5

Reply via email to