mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 18:28:25 +00:00
pxe: support pxe clients with custom vendor-class
From 606d638918edb0e0ec07fe27eb68d06fb5ebd981 Mon Sep 17 00:00:00 2001 From: Miao Wang <shankerwangmiao@gmail.com> Date: Fri, 4 Dec 2020 09:59:37 +0800 Subject: [PATCH v2] pxe: support pxe clients with custom vendor-class According to UEFI[1] and PXE[2] specs, PXE clients are required to have `PXEClient` identfier in the vendor-class field of DHCP requests, and PXE servers should also include that identifier in their responses. However, the firmware of servers from a few vendors[3] are customized to include a different identifier. This patch adds an option named `dhcp-pxe-vendor` to provide a list of such identifiers. The identifier used in responses sent from dnsmasq is identical to that in the coresponding request. [1]: https://uefi.org/sites/default/files/resources/UEFI%20Spec%202.8B%20May%202020.pdf [2]: http://www.pix.net/software/pxeboot/archive/pxespec.pdf [3]: For instance, TaiShan servers from Huawei, which are Arm64-based, send `HW-Client` in PXE requests up to now. Signed-off-by: Miao Wang <shankerwangmiao@gmail.com>
This commit is contained in:
committed by
Simon Kelley
parent
f60fea1fb0
commit
4ded96209e
27
src/option.c
27
src/option.c
@@ -167,6 +167,7 @@ struct myoption {
|
||||
#define LOPT_IGNORE_CLID 358
|
||||
#define LOPT_SINGLE_PORT 359
|
||||
#define LOPT_SCRIPT_TIME 360
|
||||
#define LOPT_PXE_VENDOR 361
|
||||
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
static const struct option opts[] =
|
||||
@@ -270,6 +271,7 @@ static const struct myoption opts[] =
|
||||
{ "dhcp-circuitid", 1, 0, LOPT_CIRCUIT },
|
||||
{ "dhcp-remoteid", 1, 0, LOPT_REMOTE },
|
||||
{ "dhcp-subscrid", 1, 0, LOPT_SUBSCR },
|
||||
{ "dhcp-pxe-vendor", 1, 0, LOPT_PXE_VENDOR },
|
||||
{ "interface-name", 1, 0, LOPT_INTNAME },
|
||||
{ "dhcp-hostsfile", 1, 0, LOPT_DHCP_HOST },
|
||||
{ "dhcp-optsfile", 1, 0, LOPT_DHCP_OPTS },
|
||||
@@ -383,6 +385,7 @@ static struct {
|
||||
{ LOPT_CIRCUIT, ARG_DUP, "set:<tag>,<circuit>", gettext_noop("Map RFC3046 circuit-id to tag."), NULL },
|
||||
{ LOPT_REMOTE, ARG_DUP, "set:<tag>,<remote>", gettext_noop("Map RFC3046 remote-id to tag."), NULL },
|
||||
{ LOPT_SUBSCR, ARG_DUP, "set:<tag>,<remote>", gettext_noop("Map RFC3993 subscriber-id to tag."), NULL },
|
||||
{ LOPT_PXE_VENDOR, ARG_DUP, "<vendor>[,...]", gettext_noop("Specify vendor class to match for PXE requests."), NULL },
|
||||
{ 'J', ARG_DUP, "tag:<tag>...", gettext_noop("Don't do DHCP for hosts with tag set."), NULL },
|
||||
{ LOPT_BROADCAST, ARG_DUP, "[=tag:<tag>...]", gettext_noop("Force broadcast replies for hosts with tag set."), NULL },
|
||||
{ 'k', OPT_NO_FORK, NULL, gettext_noop("Do NOT fork into the background, do NOT run in debug mode."), NULL },
|
||||
@@ -3672,8 +3675,8 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
||||
new->val = opt_malloc(new->len);
|
||||
memcpy(new->val + 1, arg, new->len - 1);
|
||||
|
||||
new->u.vendor_class = (unsigned char *)"PXEClient";
|
||||
new->flags = DHOPT_VENDOR;
|
||||
new->u.vendor_class = NULL;
|
||||
new->flags = DHOPT_VENDOR | DHOPT_VENDOR_PXE;
|
||||
|
||||
if (comma && atoi_check(comma, &timeout))
|
||||
*(new->val) = timeout;
|
||||
@@ -3935,6 +3938,19 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
||||
new->next = daemon->override_relays;
|
||||
daemon->override_relays = new;
|
||||
arg = comma;
|
||||
}
|
||||
break;
|
||||
|
||||
case LOPT_PXE_VENDOR: /* --dhcp-pxe-vendor */
|
||||
{
|
||||
while (arg) {
|
||||
struct dhcp_pxe_vendor *new = opt_malloc(sizeof(struct dhcp_pxe_vendor));
|
||||
comma = split(arg);
|
||||
new->data = opt_string_alloc(arg);
|
||||
new->next = daemon->dhcp_pxe_vendors;
|
||||
daemon->dhcp_pxe_vendors = new;
|
||||
arg = comma;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -5212,6 +5228,13 @@ void read_opts(int argc, char **argv, char *compile_opts)
|
||||
strcat(buff, daemon->authserver);
|
||||
daemon->hostmaster = opt_string_alloc(buff);
|
||||
}
|
||||
|
||||
if (!daemon->dhcp_pxe_vendors)
|
||||
{
|
||||
daemon->dhcp_pxe_vendors = opt_malloc(sizeof(struct dhcp_pxe_vendor));
|
||||
daemon->dhcp_pxe_vendors->data = opt_string_alloc(DHCP_PXE_DEF_VENDOR);
|
||||
daemon->dhcp_pxe_vendors->next = NULL;
|
||||
}
|
||||
|
||||
/* only one of these need be specified: the other defaults to the host-name */
|
||||
if (option_bool(OPT_LOCALMX) || daemon->mxnames || daemon->mxtarget)
|
||||
|
||||
Reference in New Issue
Block a user