aboutsummaryrefslogtreecommitdiff
path: root/sbin/dhclient
diff options
context:
space:
mode:
authorLuiz Otavio O Souza <loos@FreeBSD.org>2021-07-21 15:41:22 +0000
committerKristof Provost <kp@FreeBSD.org>2021-07-26 21:13:31 +0000
commit1e7fe2fbb9c0bed230d8db94d7444a90ca5ce199 (patch)
tree34126d25c328264f367a8e49b870706de2dafa4c /sbin/dhclient
parent4b765ab4cda051a6d9ceb5fb9cac80c7f3b910bf (diff)
Diffstat (limited to 'sbin/dhclient')
-rw-r--r--sbin/dhclient/bpf.c8
-rw-r--r--sbin/dhclient/clparse.c6
-rw-r--r--sbin/dhclient/conflex.c2
-rw-r--r--sbin/dhclient/dhclient.conf.59
-rw-r--r--sbin/dhclient/dhcpd.h1
-rw-r--r--sbin/dhclient/dhctoken.h1
6 files changed, 26 insertions, 1 deletions
diff --git a/sbin/dhclient/bpf.c b/sbin/dhclient/bpf.c
index 4a753fd27595..a50abca62fd3 100644
--- a/sbin/dhclient/bpf.c
+++ b/sbin/dhclient/bpf.c
@@ -90,6 +90,14 @@ if_register_bpf(struct interface_info *info, int flags)
error("Can't attach interface %s to bpf device %s: %m",
info->name, filename);
+ /* Tag the packets with the proper VLAN PCP setting. */
+ if (info->client->config->vlan_pcp != 0) {
+ if (ioctl(sock, BIOCSETVLANPCP,
+ &info->client->config->vlan_pcp) < 0)
+ error( "Can't set the VLAN PCP tag on interface %s: %m",
+ info->name);
+ }
+
return (sock);
}
diff --git a/sbin/dhclient/clparse.c b/sbin/dhclient/clparse.c
index 66695fd6b8f0..58ece525f8d1 100644
--- a/sbin/dhclient/clparse.c
+++ b/sbin/dhclient/clparse.c
@@ -76,6 +76,7 @@ read_client_conf(void)
memset(&top_level_config, 0, sizeof(top_level_config));
/* Set some defaults... */
+ top_level_config.vlan_pcp = 0;
top_level_config.timeout = 60;
top_level_config.select_interval = 0;
top_level_config.reboot_timeout = 10;
@@ -201,6 +202,7 @@ parse_client_statement(FILE *cfile, struct interface_info *ip,
int token;
char *val;
struct option *option;
+ time_t tmp;
switch (next_token(&val, cfile)) {
case SEND:
@@ -260,6 +262,10 @@ parse_client_statement(FILE *cfile, struct interface_info *ip,
case REBOOT:
parse_lease_time(cfile, &config->reboot_timeout);
return;
+ case VLAN_PCP:
+ parse_lease_time(cfile, &tmp);
+ config->vlan_pcp = (u_int)tmp;
+ return;
case BACKOFF_CUTOFF:
parse_lease_time(cfile, &config->backoff_cutoff);
return;
diff --git a/sbin/dhclient/conflex.c b/sbin/dhclient/conflex.c
index 66fc9e397125..c11c9189527e 100644
--- a/sbin/dhclient/conflex.c
+++ b/sbin/dhclient/conflex.c
@@ -524,6 +524,8 @@ intern(char *atom, int dfv)
case 'v':
if (!strcasecmp(atom + 1, "endor-class"))
return (VENDOR_CLASS);
+ if (!strcasecmp(atom + 1, "lan-pcp"))
+ return (VLAN_PCP);
break;
case 'y':
if (!strcasecmp(atom + 1, "iaddr"))
diff --git a/sbin/dhclient/dhclient.conf.5 b/sbin/dhclient/dhclient.conf.5
index 2f28c5722574..14a0de4111dd 100644
--- a/sbin/dhclient/dhclient.conf.5
+++ b/sbin/dhclient/dhclient.conf.5
@@ -38,7 +38,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 31, 2018
+.Dd July 21, 2021
.Dt DHCLIENT.CONF 5
.Os
.Sh NAME
@@ -484,6 +484,13 @@ lease database and will record the media type used to acquire the address.
Whenever the client tries to renew the lease, it will use that same media type.
The lease must expire before the client will go back to cycling through media
types.
+.It Ic vlan-pcp Ar code ;
+The
+.Ic vlan-pcp
+statement sets the PCP (Priority Code Point) value for the VLAN header.
+This requires the
+.Va net.link.vlan.mtag_pcp
+sysctl to be set to 1.
.El
.Sh EXAMPLES
The following configuration file is used on a laptop
diff --git a/sbin/dhclient/dhcpd.h b/sbin/dhclient/dhcpd.h
index 240a3ae23bda..b151daa90a1c 100644
--- a/sbin/dhclient/dhcpd.h
+++ b/sbin/dhclient/dhcpd.h
@@ -159,6 +159,7 @@ struct client_config {
u_int8_t required_options[256];
u_int8_t requested_options[256];
int requested_option_count;
+ u_int vlan_pcp;
time_t timeout;
time_t initial_interval;
time_t retry_interval;
diff --git a/sbin/dhclient/dhctoken.h b/sbin/dhclient/dhctoken.h
index 26c81aa734dc..c929307c7e06 100644
--- a/sbin/dhclient/dhctoken.h
+++ b/sbin/dhclient/dhctoken.h
@@ -133,6 +133,7 @@
#define AUTHORITATIVE 333
#define TOKEN_NOT 334
#define ALWAYS_REPLY_RFC1048 335
+#define VLAN_PCP 336
#define is_identifier(x) ((x) >= FIRST_TOKEN && \
(x) != STRING && \