Skip to content

Commit ea51deb

Browse files
committed
dhcp: shorten BPF code a bit
- replace `A = k` and `X = A` with `X = k`, - replace `A ^= X` and `A == 0` with `A == X`. - use UINT32_MAX when accept a packet
1 parent 155943b commit ea51deb

File tree

1 file changed

+6
-10
lines changed

1 file changed

+6
-10
lines changed

src/libsystemd-network/dhcp-network.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,20 @@ static int _bind_raw_socket(int ifindex, union sockaddr_union *link,
5858

5959
/* We only support MAC address length to be either 0 or 6 (ETH_ALEN). Optionally
6060
* compare chaddr for ETH_ALEN bytes. */
61-
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETH_ALEN, 0, 12), /* A (the MAC address length) == ETH_ALEN ? */
62-
BPF_STMT(BPF_LD + BPF_IMM, unaligned_read_be32(&eth_mac->ether_addr_octet[0])), /* A <- 4 bytes of client's MAC */
63-
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
61+
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETH_ALEN, 0, 8), /* A (the MAC address length) == ETH_ALEN ? */
62+
BPF_STMT(BPF_LDX + BPF_IMM, unaligned_read_be32(&eth_mac->ether_addr_octet[0])), /* X <- 4 bytes of client's MAC */
6463
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.chaddr)), /* A <- 4 bytes of MAC from dhcp.chaddr */
65-
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
66-
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 1, 0), /* A == 0 ? */
64+
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_X, 0, 1, 0), /* A == X ? */
6765
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
68-
BPF_STMT(BPF_LD + BPF_IMM, unaligned_read_be16(&eth_mac->ether_addr_octet[4])), /* A <- remainder of client's MAC */
69-
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
66+
BPF_STMT(BPF_LDX + BPF_IMM, unaligned_read_be16(&eth_mac->ether_addr_octet[4])), /* X <- remainder of client's MAC */
7067
BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(DHCPPacket, dhcp.chaddr) + 4), /* A <- remainder of MAC from dhcp.chaddr */
71-
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
72-
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 1, 0), /* A == 0 ? */
68+
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_X, 0, 1, 0), /* A == X ? */
7369
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
7470

7571
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(DHCPPacket, dhcp.magic)), /* A <- DHCP magic cookie */
7672
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, DHCP_MAGIC_COOKIE, 1, 0), /* cookie == DHCP magic cookie ? */
7773
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
78-
BPF_STMT(BPF_RET + BPF_K, 65535), /* return all */
74+
BPF_STMT(BPF_RET + BPF_K, UINT32_MAX), /* accept */
7975
};
8076
struct sock_fprog fprog = {
8177
.len = ELEMENTSOF(filter),

0 commit comments

Comments
 (0)