Add socket mark and priority to fields that can be set by
ebpf program when a socket is created.

Signed-off-by: David Ahern <dsah...@gmail.com>
---
 include/uapi/linux/bpf.h |  2 ++
 net/core/filter.c        | 26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 843818dff96d..a89e5e6dff7c 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -764,6 +764,8 @@ struct bpf_sock {
        __u32 family;
        __u32 type;
        __u32 protocol;
+       __u32 mark;
+       __u32 priority;
 };
 
 #define XDP_PACKET_HEADROOM 256
diff --git a/net/core/filter.c b/net/core/filter.c
index fa2115695037..7ee75a40ff03 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -3444,6 +3444,10 @@ static bool sock_filter_is_valid_access(int off, int 
size,
                switch (off) {
                case offsetof(struct bpf_sock, bound_dev_if):
                        break;
+               case offsetof(struct bpf_sock, mark):
+                       break;
+               case offsetof(struct bpf_sock, priority):
+                       break;
                default:
                        return false;
                }
@@ -3952,6 +3956,28 @@ static u32 sock_filter_convert_ctx_access(enum 
bpf_access_type type,
                                      offsetof(struct sock, sk_bound_dev_if));
                break;
 
+       case offsetof(struct bpf_sock, mark):
+               BUILD_BUG_ON(FIELD_SIZEOF(struct sock, sk_mark) != 4);
+
+               if (type == BPF_WRITE)
+                       *insn++ = BPF_STX_MEM(BPF_W, si->dst_reg, si->src_reg,
+                                       offsetof(struct sock, sk_mark));
+               else
+                       *insn++ = BPF_LDX_MEM(BPF_W, si->dst_reg, si->src_reg,
+                                     offsetof(struct sock, sk_mark));
+               break;
+
+       case offsetof(struct bpf_sock, priority):
+               BUILD_BUG_ON(FIELD_SIZEOF(struct sock, sk_priority) != 4);
+
+               if (type == BPF_WRITE)
+                       *insn++ = BPF_STX_MEM(BPF_W, si->dst_reg, si->src_reg,
+                                       offsetof(struct sock, sk_priority));
+               else
+                       *insn++ = BPF_LDX_MEM(BPF_W, si->dst_reg, si->src_reg,
+                                     offsetof(struct sock, sk_priority));
+               break;
+
        case offsetof(struct bpf_sock, family):
                BUILD_BUG_ON(FIELD_SIZEOF(struct sock, sk_family) != 2);
 
-- 
2.1.4

Reply via email to