summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancis Dupont <fdupont@isc.org>2020-11-06 10:46:09 +0100
committerFrancis Dupont <fdupont@isc.org>2020-11-06 10:46:09 +0100
commitc7c7f00d9508a9f4eaa09ed4a4cdcdbbe9621a67 (patch)
treea59103dd1cf4e2e2e167304e24ce167ba7e8f98c
parent8ac27e5835e2a3b181801c85708ccf6677ea08f3 (diff)
downloadisc-dhcp-146-add-support-for-raw-ip-interface-type.tar.gz
-rw-r--r--common/bpf.c10
-rw-r--r--common/lpf.c89
2 files changed, 65 insertions, 34 deletions
diff --git a/common/bpf.c b/common/bpf.c
index c637069e..e9260e23 100644
--- a/common/bpf.c
+++ b/common/bpf.c
@@ -214,13 +214,13 @@ struct bpf_insn dhcp_bpf_pureip_filter [] = {
/* Make sure it's to the right port... */
BPF_STMT (BPF_LD + BPF_H + BPF_IND, 2),
- BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 37, 0, 1), /* patch */
+ BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 67, 0, 1), /* patch */
/* If we passed all the tests, ask for the whole packet. */
- BPF_STMT(BPF_RET+BPF_K, (u_int)-1),
+ BPF_STMT(BPF_RET + BPF_K, (u_int)-1),
/* Otherwise, drop it. */
- BPF_STMT(BPF_RET+BPF_K, 0),
+ BPF_STMT(BPF_RET + BPF_K, 0),
};
int dhcp_bpf_pureip_filter_len =
@@ -278,11 +278,11 @@ struct bpf_insn dhcp_bpf_pureip_relay_filter [] = {
/* Make sure it's to the right port... */
BPF_STMT (BPF_LD + BPF_H + BPF_IND, 16),
- BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 37, 2, 0), /* patch */
+ BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 67, 2, 0), /* patch */
/* relay can have an alternative port... */
BPF_STMT (BPF_LD + BPF_H + BPF_IND, 16),
- BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 37, 0, 1), /* patch */
+ BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, 67, 0, 1), /* patch */
/* If we passed all the tests, ask for the whole packet. */
BPF_STMT (BPF_RET + BPF_K, (u_int)-1),
diff --git a/common/lpf.c b/common/lpf.c
index 6cbedcfc..8103a686 100644
--- a/common/lpf.c
+++ b/common/lpf.c
@@ -221,6 +221,9 @@ void if_register_receive (info)
lpf_tr_filter_setup (info);
else
#endif
+ if (info -> hw_address.hbuf [0] == HTYPE_PUREIP)
+ lpf_pureip_filter_setup (info);
+ else
lpf_gen_filter_setup (info);
if (!quiet_interface_discovery)
@@ -255,50 +258,78 @@ void if_deregister_receive (info)
static void lpf_gen_filter_setup (info)
struct interface_info *info;
{
- int pure_ip = info -> hw_address.hbuf [0] == HTYPE_PUREIP;
struct sock_fprog p;
memset(&p, 0, sizeof(p));
- /* Set up the bpf filter program structure and patch port(s).
- *
- * This is defined in bpf.c, XXX changes to filter program may
- * require changes to the insn number(s) used below! XXX
- */
+ /* Set up the bpf filter program structure. This is defined in
+ bpf.c */
+ p.len = dhcp_bpf_filter_len;
+ p.filter = dhcp_bpf_filter;
+
+ dhcp_bpf_filter [8].k = ntohs (local_port);
- if (pure_ip) {
- p.len = dhcp_bpf_pureip_filter_len;
- p.filter = dhcp_bpf_pureip_filter;
+ /* Patch the server port into the LPF program...
+ XXX changes to filter program may require changes
+ to the insn number(s) used below! XXX */
+#if defined(RELAY_PORT)
+ if (relay_port) {
+ /*
+ * If user defined relay UDP port, we need to filter
+ * also on the user UDP port.
+ */
+ p.len = dhcp_bpf_relay_filter_len;
+ p.filter = dhcp_bpf_relay_filter;
- /* patch port */
- dhcp_bpf_pureip_filter [6].k = ntohs (local_port);
- } else {
- p.len = dhcp_bpf_filter_len;
- p.filter = dhcp_bpf_filter;
+ dhcp_bpf_relay_filter [8].k = ntohs (local_port);
+ dhcp_bpf_relay_filter [10].k = ntohs (relay_port);
+ }
+#endif
- /* patch port */
- dhcp_bpf_filter [8].k = ntohs (local_port);
+ if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p,
+ sizeof p) < 0) {
+ if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
+ errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
+ errno == EAFNOSUPPORT) {
+ log_error ("socket: %m - make sure");
+ log_error ("CONFIG_PACKET (Packet socket) %s",
+ "and CONFIG_FILTER");
+ log_error ("(Socket Filtering) are enabled %s",
+ "in your kernel");
+ log_fatal ("configuration!");
+ }
+ log_fatal ("Can't install packet filter program: %m");
}
+}
+
+static void lpf_pureip_gen_filter_setup (info)
+ struct interface_info *info;
+{
+ struct sock_fprog p;
+
+ memset(&p, 0, sizeof(p));
+
+ /* Set up the bpf filter program structure. This is defined in
+ bpf.c */
+ p.len = dhcp_bpf_pureip_filter_len;
+ p.filter = dhcp_bpf_pureip_filter;
+
+ dhcp_bpf_pureip_filter [6].k = ntohs (local_port);
+ /* Patch the server port into the LPF program...
+ XXX changes to filter program may require changes
+ to the insn number(s) used below! XXX */
#if defined(RELAY_PORT)
- /*
- * If user defined relay UDP port, we need to filter
- * also on the user UDP port.
- */
- if (relay_port && pure_ip) {
+ if (relay_port) {
+ /*
+ * If user defined relay UDP port, we need to filter
+ * also on the user UDP port.
+ */
p.len = dhcp_bpf_pureip_relay_filter_len;
p.filter = dhcp_bpf_pureip_relay_filter;
- /* patch ports */
dhcp_bpf_pureip_relay_filter [6].k = ntohs (local_port);
dhcp_bpf_pureip_relay_filter [8].k = ntohs (relay_port);
- } else if (relay_port) {
- p.len = dhcp_bpf_relay_filter_len;
- p.filter = dhcp_bpf_relay_filter;
-
- /* patch ports */
- dhcp_bpf_relay_filter [8].k = ntohs (local_port);
- dhcp_bpf_relay_filter [10].k = ntohs (relay_port);
}
#endif