|
5 | 5 | /*-
|
6 | 6 | * SPDX-License-Identifier: BSD-3-Clause
|
7 | 7 | *
|
8 |
| - * Copyright (c) 2018 Franco Fichtner <franco@opnsense.org> |
| 8 | + * Copyright (c) 2018-2021 Franco Fichtner <franco@opnsense.org> |
9 | 9 | * Copyright (c) 1995, 1996, 1998, 1999
|
10 | 10 | * The Internet Software Consortium. All rights reserved.
|
11 | 11 | *
|
@@ -203,20 +203,41 @@ if_register_send(struct interface_info *info)
|
203 | 203 | * constant offsets used in if_register_send to patch the BPF program!
|
204 | 204 | */
|
205 | 205 | static struct bpf_insn dhcp_bpf_filter[] = {
|
| 206 | + /* Set packet index for IP packet... */ |
| 207 | + BPF_STMT(BPF_LDX + BPF_W + BPF_IMM, 0), |
| 208 | + |
| 209 | + /* Test whether this is a VLAN packet... */ |
| 210 | + BPF_STMT(BPF_LD + BPF_H + BPF_IND, 12), |
| 211 | + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_VLAN, 0, 4), |
| 212 | + |
| 213 | + /* Test whether it has a VID of 0 */ |
| 214 | + BPF_STMT(BPF_LD + BPF_H + BPF_IND, 14), |
| 215 | + BPF_STMT(BPF_ALU + BPF_AND + BPF_K, 0xfff), |
| 216 | + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 0, 1), |
| 217 | + |
| 218 | + /* Correct the packet index for VLAN... */ |
| 219 | + BPF_STMT(BPF_LDX + BPF_W + BPF_IMM, 4), |
| 220 | + |
206 | 221 | /* Make sure this is an IP packet... */
|
207 |
| - BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 12), |
208 |
| - BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 8), |
| 222 | + BPF_STMT(BPF_LD + BPF_H + BPF_IND, 12), |
| 223 | + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 14), |
209 | 224 |
|
210 | 225 | /* Make sure it's a UDP packet... */
|
211 |
| - BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 23), |
212 |
| - BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6), |
| 226 | + BPF_STMT(BPF_LD + BPF_B + BPF_IND, 23), |
| 227 | + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 12), |
213 | 228 |
|
214 | 229 | /* Make sure this isn't a fragment... */
|
215 |
| - BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 20), |
216 |
| - BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 4, 0), |
| 230 | + BPF_STMT(BPF_LD + BPF_H + BPF_IND, 20), |
| 231 | + BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 10, 0), |
217 | 232 |
|
218 | 233 | /* Get the IP header length... */
|
| 234 | + BPF_STMT(BPF_MISC + BPF_TXA, 0), |
| 235 | + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 0, 2), |
219 | 236 | BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 14),
|
| 237 | + BPF_JUMP(BPF_JMP + BPF_JA, 1, 0, 0), |
| 238 | + BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 18), |
| 239 | + BPF_STMT(BPF_ALU + BPF_ADD + BPF_X, 0), |
| 240 | + BPF_STMT(BPF_MISC + BPF_TAX, 0), |
220 | 241 |
|
221 | 242 | /* Make sure it's to the right port... */
|
222 | 243 | BPF_STMT(BPF_LD + BPF_H + BPF_IND, 16),
|
@@ -279,7 +300,7 @@ if_register_receive(struct interface_info *info)
|
279 | 300 | * XXX: changes to filter program may require changes to the
|
280 | 301 | * insn number(s) used below!
|
281 | 302 | */
|
282 |
| - dhcp_bpf_filter[8].k = LOCAL_PORT; |
| 303 | + dhcp_bpf_filter[21].k = LOCAL_PORT; |
283 | 304 |
|
284 | 305 | if (ioctl(info->rfdesc, BIOCSETF, &p) < 0)
|
285 | 306 | error("Can't install packet filter program: %m");
|
|
0 commit comments