Skip to content

Commit aa4c103

Browse files
David Aherndavem330
authored andcommitted
bpf: Add support for reading socket family, type, protocol
Add socket family, type and protocol to bpf_sock allowing bpf programs read-only access. Add __sk_flags_offset[0] to struct sock before the bitfield to programmtically determine the offset of the unsigned int containing protocol and type. Signed-off-by: David Ahern <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ad2805d commit aa4c103

3 files changed

Lines changed: 39 additions & 0 deletions

File tree

include/net/sock.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,21 @@ struct sock {
389389
* Because of non atomicity rules, all
390390
* changes are protected by socket lock.
391391
*/
392+
unsigned int __sk_flags_offset[0];
393+
#ifdef __BIG_ENDIAN_BITFIELD
394+
#define SK_FL_PROTO_SHIFT 16
395+
#define SK_FL_PROTO_MASK 0x00ff0000
396+
397+
#define SK_FL_TYPE_SHIFT 0
398+
#define SK_FL_TYPE_MASK 0x0000ffff
399+
#else
400+
#define SK_FL_PROTO_SHIFT 8
401+
#define SK_FL_PROTO_MASK 0x0000ff00
402+
403+
#define SK_FL_TYPE_SHIFT 16
404+
#define SK_FL_TYPE_MASK 0xffff0000
405+
#endif
406+
392407
kmemcheck_bitfield_begin(flags);
393408
unsigned int sk_padding : 2,
394409
sk_no_check_tx : 1,

include/uapi/linux/bpf.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,9 @@ enum bpf_ret_code {
571571

572572
struct bpf_sock {
573573
__u32 bound_dev_if;
574+
__u32 family;
575+
__u32 type;
576+
__u32 protocol;
574577
};
575578

576579
/* User return codes for XDP prog type.

net/core/filter.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3121,6 +3121,27 @@ static u32 sock_filter_convert_ctx_access(enum bpf_access_type type,
31213121
*insn++ = BPF_LDX_MEM(BPF_W, dst_reg, src_reg,
31223122
offsetof(struct sock, sk_bound_dev_if));
31233123
break;
3124+
3125+
case offsetof(struct bpf_sock, family):
3126+
BUILD_BUG_ON(FIELD_SIZEOF(struct sock, sk_family) != 2);
3127+
3128+
*insn++ = BPF_LDX_MEM(BPF_H, dst_reg, src_reg,
3129+
offsetof(struct sock, sk_family));
3130+
break;
3131+
3132+
case offsetof(struct bpf_sock, type):
3133+
*insn++ = BPF_LDX_MEM(BPF_W, dst_reg, src_reg,
3134+
offsetof(struct sock, __sk_flags_offset));
3135+
*insn++ = BPF_ALU32_IMM(BPF_AND, dst_reg, SK_FL_TYPE_MASK);
3136+
*insn++ = BPF_ALU32_IMM(BPF_RSH, dst_reg, SK_FL_TYPE_SHIFT);
3137+
break;
3138+
3139+
case offsetof(struct bpf_sock, protocol):
3140+
*insn++ = BPF_LDX_MEM(BPF_W, dst_reg, src_reg,
3141+
offsetof(struct sock, __sk_flags_offset));
3142+
*insn++ = BPF_ALU32_IMM(BPF_AND, dst_reg, SK_FL_PROTO_MASK);
3143+
*insn++ = BPF_ALU32_IMM(BPF_RSH, dst_reg, SK_FL_PROTO_SHIFT);
3144+
break;
31243145
}
31253146

31263147
return insn - insn_buf;

0 commit comments

Comments
 (0)