Skip to content

Commit fb8ea2e

Browse files
committed
update(driver/bpf): make the necessary arrangements to include
relocations for reads. This commit also contains the verifier fixes from #1733 and #1730 to get to a loadable state, will likely need to remove them before merging. Signed-off-by: Lorenzo Fontana <lo@linux.com>
1 parent 81228e8 commit fb8ea2e

File tree

7 files changed

+144
-133
lines changed

7 files changed

+144
-133
lines changed

cmake/modules/libbpf.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux")
3535
set(LIBBPF_LIB "${LIBBPF_BUILD_DIR}/root/usr/lib64/libbpf.a")
3636
ExternalProject_Add(
3737
libbpf
38-
URL "https://github.com/libbpf/libbpf/archive/v0.3.tar.gz"
38+
URL "https://github.com/libbpf/libbpf/archive/a199b854156ccac574eb031d464d8fd1a5523ce2.tar.gz"
3939
URL_HASH
40-
"SHA256=c168d84a75b541f753ceb49015d9eb886e3fb5cca87cdd9aabce7e10ad3a1efc"
40+
"SHA256=9519fb0df06db85484ce934adf7a4b0ea9363c9496a2b427acdd03a0a9d9348d"
4141
CONFIGURE_COMMAND mkdir -p build root
4242
BUILD_COMMAND BUILD_STATIC_ONLY=y OBJDIR=${LIBBPF_BUILD_DIR}/build DESTDIR=${LIBBPF_BUILD_DIR}/root make -C ${LIBBPF_SRC}/libbpf/src install
4343
INSTALL_COMMAND "")

driver/bpf/filler_helpers.h

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,19 @@ static __always_inline struct file *bpf_fget(int fd)
3939
if (!task)
4040
return NULL;
4141

42-
files = _READ(task->files);
42+
files = _SYSDIG_READ(task, files);
4343
if (!files)
4444
return NULL;
4545

46-
fdt = _READ(files->fdt);
46+
fdt = _SYSDIG_READ(files, fdt);
4747
if (!fdt)
4848
return NULL;
4949

50-
max_fds = _READ(fdt->max_fds);
50+
max_fds = _SYSDIG_READ(fdt, max_fds);
5151
if (fd >= max_fds)
5252
return NULL;
5353

54-
fds = _READ(fdt->fd);
54+
fds = _SYSDIG_READ(fdt, fd);
5555
fil = _READ(fds[fd]);
5656

5757
return fil;
@@ -71,11 +71,11 @@ static __always_inline struct socket *bpf_sockfd_lookup(struct filler_data *data
7171
if (!file)
7272
return NULL;
7373

74-
fop = _READ(file->f_op);
74+
fop = _SYSDIG_READ(file, f_op);
7575
if (fop != data->settings->socket_file_ops)
7676
return NULL;
7777

78-
sock = _READ(file->private_data);
78+
sock = _SYSDIG_READ(file, private_data);
7979
return sock;
8080
}
8181

@@ -98,18 +98,18 @@ static __always_inline bool bpf_get_fd_dev_ino(int fd, unsigned long *dev, unsig
9898
if (!file)
9999
return false;
100100

101-
inode = _READ(file->f_inode);
101+
inode = _SYSDIG_READ(file, f_inode);
102102
if (!inode)
103103
return false;
104104

105-
sb = _READ(inode->i_sb);
105+
sb = _SYSDIG_READ(inode, i_sb);
106106
if (!sb)
107107
return false;
108108

109-
kdev = _READ(sb->s_dev);
109+
kdev = _SYSDIG_READ(sb, s_dev);
110110
*dev = bpf_encode_dev(kdev);
111111

112-
*ino = _READ(inode->i_ino);
112+
*ino = _SYSDIG_READ(inode, i_ino);
113113

114114
return true;
115115
}
@@ -128,11 +128,11 @@ static __always_inline bool bpf_getsockname(struct socket *sock,
128128
struct sock *sk;
129129
sa_family_t family;
130130

131-
sk = _READ(sock->sk);
131+
sk = _SYSDIG_READ(sock, sk);
132132
if (!sk)
133133
return false;
134134

135-
family = _READ(sk->sk_family);
135+
family = _SYSDIG_READ(sk, sk_family);
136136

137137
switch (family) {
138138
case AF_INET:
@@ -142,14 +142,14 @@ static __always_inline bool bpf_getsockname(struct socket *sock,
142142

143143
sin->sin_family = AF_INET;
144144
if (peer) {
145-
sin->sin_port = _READ(inet->inet_dport);
146-
sin->sin_addr.s_addr = _READ(inet->inet_daddr);
145+
sin->sin_port = _SYSDIG_READ(inet, inet_dport);
146+
sin->sin_addr.s_addr = _SYSDIG_READ(inet, inet_daddr);
147147
} else {
148-
u32 addr = _READ(inet->inet_rcv_saddr);
148+
u32 addr = _SYSDIG_READ(inet, inet_rcv_saddr);
149149

150150
if (!addr)
151-
addr = _READ(inet->inet_saddr);
152-
sin->sin_port = _READ(inet->inet_sport);
151+
addr = _SYSDIG_READ(inet, inet_saddr);
152+
sin->sin_port = _SYSDIG_READ(inet, inet_sport);
153153
sin->sin_addr.s_addr = addr;
154154
}
155155

@@ -162,17 +162,17 @@ static __always_inline bool bpf_getsockname(struct socket *sock,
162162
struct ipv6_pinfo {
163163
struct in6_addr saddr;
164164
};
165-
struct ipv6_pinfo *np = (struct ipv6_pinfo *)_READ(inet->pinet6);
165+
struct ipv6_pinfo *np = (struct ipv6_pinfo *)_SYSDIG_READ(inet, pinet6);
166166

167167
sin->sin6_family = AF_INET6;
168168
if (peer) {
169-
sin->sin6_port = _READ(inet->inet_dport);
170-
sin->sin6_addr = _READ(sk->sk_v6_daddr);
169+
sin->sin6_port = _SYSDIG_READ(inet, inet_dport);
170+
sin->sin6_addr = _SYSDIG_READ(sk, sk_v6_daddr);
171171
} else {
172-
sin->sin6_addr = _READ(sk->sk_v6_rcv_saddr);
172+
sin->sin6_addr = _SYSDIG_READ(sk, sk_v6_rcv_saddr);
173173
if (bpf_ipv6_addr_any(&sin->sin6_addr))
174-
sin->sin6_addr = _READ(np->saddr);
175-
sin->sin6_port = _READ(inet->inet_sport);
174+
sin->sin6_addr = _SYSDIG_READ(np, saddr);
175+
sin->sin6_port = _SYSDIG_READ(inet, inet_sport);
176176
}
177177

178178
break;
@@ -184,15 +184,15 @@ static __always_inline bool bpf_getsockname(struct socket *sock,
184184
struct unix_address *addr;
185185

186186
if (peer)
187-
sk = _READ(((struct unix_sock *)sk)->peer);
187+
sk = _SYSDIG_READ(((struct unix_sock *)sk), peer);
188188

189189
u = (struct unix_sock *)sk;
190-
addr = _READ(u->addr);
190+
addr = _SYSDIG_READ(u, addr);
191191
if (!addr) {
192192
sunaddr->sun_family = AF_UNIX;
193193
sunaddr->sun_path[0] = 0;
194194
} else {
195-
unsigned int len = _READ(addr->len);
195+
unsigned int len = _SYSDIG_READ(addr, len);
196196

197197
if (len > sizeof(struct sockaddr_storage))
198198
len = sizeof(struct sockaddr_storage);
@@ -217,8 +217,8 @@ static __always_inline bool bpf_getsockname(struct socket *sock,
217217
static __always_inline int bpf_addr_to_kernel(void *uaddr, int ulen,
218218
struct sockaddr *kaddr)
219219
{
220-
if (ulen < 0 || ulen > sizeof(struct sockaddr_storage))
221-
return -EINVAL;
220+
if (ulen > BPF_MAX_VAR_SIZE)
221+
return -EINVAL;
222222

223223
if (ulen == 0)
224224
return 0;
@@ -256,11 +256,11 @@ static __always_inline u32 bpf_compute_snaplen(struct filler_data *data,
256256
if (!fil)
257257
return res;
258258

259-
f_inode = _READ(fil->f_inode);
259+
f_inode = _SYSDIG_READ(fil, f_inode);
260260
if (!f_inode)
261261
return res;
262262

263-
i_rdev = _READ(f_inode->i_rdev);
263+
i_rdev = _SYSDIG_READ(f_inode, i_rdev);
264264
if (i_rdev == PPM_NULL_RDEV)
265265
return RW_SNAPLEN_EVENT;
266266
}
@@ -325,11 +325,11 @@ static __always_inline u32 bpf_compute_snaplen(struct filler_data *data,
325325
return res;
326326
}
327327

328-
sk = _READ(sock->sk);
328+
sk = _SYSDIG_READ(sock, sk);
329329
if (!sk)
330330
return res;
331331

332-
sa_family_t family = _READ(sk->sk_family);
332+
sa_family_t family = _SYSDIG_READ(sk, sk_family);
333333

334334
if (family == AF_INET) {
335335
sport = ntohs(((struct sockaddr_in *)sock_address)->sin_port);
@@ -528,11 +528,11 @@ static __always_inline long bpf_fd_to_socktuple(struct filler_data *data,
528528
if (!bpf_getsockname(sock, sock_address, 0))
529529
return 0;
530530

531-
sk = _READ(sock->sk);
531+
sk = _SYSDIG_READ(sock, sk);
532532
if (!sk)
533533
return 0;
534534

535-
family = _READ(sk->sk_family);
535+
family = _SYSDIG_READ(sk, sk_family);
536536

537537
switch (family) {
538538
case AF_INET:
@@ -652,7 +652,7 @@ static __always_inline long bpf_fd_to_socktuple(struct filler_data *data,
652652
* Retrieve the addresses
653653
*/
654654
struct unix_sock *us = (struct unix_sock *)sk;
655-
struct sock *speer = _READ(us->peer);
655+
struct sock *speer = _SYSDIG_READ(us, peer);
656656
char *us_name;
657657

658658
data->buf[data->state->tail_ctx.curoff & SCRATCH_SIZE_HALF] = socket_family_to_scap(family);
@@ -943,13 +943,13 @@ static __always_inline bool bpf_in_ia32_syscall()
943943
task = (struct task_struct *)bpf_get_current_task();
944944

945945
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 18)
946-
status = _READ(task->thread.status);
946+
status = _SYSDIG_READ(task, thread.status);
947947
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
948-
status = _READ(task->thread_info.status);
948+
status = _SYSDIG_READ(task, thread_info.status);
949949
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 2)
950-
status = _READ(task->thread.status);
950+
status = _SYSDIG_READ(task, thread.status);
951951
#else
952-
status = _READ(task->thread_info.status);
952+
status = _SYSDIG_READ(task, thread_info.status);
953953
#endif
954954

955955
return status & TS_COMPAT;

0 commit comments

Comments
 (0)