Page MenuHomeFreeBSD

D31515.id93594.diff
No OneTemporary

D31515.id93594.diff

Index: sbin/dhclient/bpf.c
===================================================================
--- sbin/dhclient/bpf.c
+++ sbin/dhclient/bpf.c
@@ -5,6 +5,7 @@
/*-
* SPDX-License-Identifier: BSD-3-Clause
*
+ * Copyright (c) 2021 Franco Fichtner <franco@opnsense.org>
* Copyright (c) 1995, 1996, 1998, 1999
* The Internet Software Consortium. All rights reserved.
*
@@ -189,20 +190,41 @@
* Packet filter program...
*/
static struct bpf_insn dhcp_bpf_filter[] = {
+ /* Set packet index for IP packet... */
+ BPF_STMT(BPF_LDX + BPF_W + BPF_IMM, 0),
+
+ /* Test whether this is a VLAN packet... */
+ BPF_STMT(BPF_LD + BPF_H + BPF_IND, 12),
+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_VLAN, 0, 4),
+
+ /* Test whether it has a VID of 0 */
+ BPF_STMT(BPF_LD + BPF_H + BPF_IND, 14),
+ BPF_STMT(BPF_ALU + BPF_AND + BPF_K, 0xfff),
+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 0, 1),
+
+ /* Correct the packet index for VLAN... */
+ BPF_STMT(BPF_LDX + BPF_W + BPF_IMM, 4),
+
/* Make sure this is an IP packet... */
- BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 12),
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 8),
+ BPF_STMT(BPF_LD + BPF_H + BPF_IND, 12),
+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 14),
/* Make sure it's a UDP packet... */
- BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 23),
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6),
+ BPF_STMT(BPF_LD + BPF_B + BPF_IND, 23),
+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 12),
/* Make sure this isn't a fragment... */
- BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 20),
- BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, IP_MF|IP_OFFMASK, 4, 0),
+ BPF_STMT(BPF_LD + BPF_H + BPF_IND, 20),
+ BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, IP_MF|IP_OFFMASK, 10, 0),
/* Get the IP header length... */
+ BPF_STMT(BPF_MISC + BPF_TXA, 0),
+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 0, 2),
BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 14),
+ BPF_JUMP(BPF_JMP + BPF_JA, 1, 0, 0),
+ BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 18),
+ BPF_STMT(BPF_ALU + BPF_ADD + BPF_X, 0),
+ BPF_STMT(BPF_MISC + BPF_TAX, 0),
/* Make sure it's to the right port... */
BPF_STMT(BPF_LD + BPF_H + BPF_IND, 16),
Index: sbin/dhclient/packet.c
===================================================================
--- sbin/dhclient/packet.c
+++ sbin/dhclient/packet.c
@@ -157,7 +157,8 @@
from->htype = ARPHRD_ETHER;
from->hlen = sizeof(eh.ether_shost);
- return (sizeof(eh));
+ return (sizeof(eh) + (ntohs(eh.ether_type) == ETHERTYPE_VLAN ?
+ ETHER_VLAN_ENCAP_LEN : 0));
}
ssize_t

File Metadata

Mime Type
text/plain
Expires
Wed, Aug 19, 8:27 PM (7 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36902669
Default Alt Text
D31515.id93594.diff (2 KB)

Event Timeline