mirror of
https://git.busybox.net/udhcp
synced 2025-05-08 22:09:45 +08:00
Support for broken clients (MSFT 98)
This commit is contained in:
parent
15a8ed91b4
commit
94b1de2e09
20
packet.c
20
packet.c
@ -23,6 +23,12 @@
|
|||||||
int get_packet(struct dhcpMessage *packet, int fd)
|
int get_packet(struct dhcpMessage *packet, int fd)
|
||||||
{
|
{
|
||||||
int bytes;
|
int bytes;
|
||||||
|
int i;
|
||||||
|
char broken_vendors[][8] = {
|
||||||
|
"MSFT 98",
|
||||||
|
""
|
||||||
|
};
|
||||||
|
char *vendor;
|
||||||
|
|
||||||
memset(packet, 0, sizeof(struct dhcpMessage));
|
memset(packet, 0, sizeof(struct dhcpMessage));
|
||||||
bytes = read(fd, packet, sizeof(struct dhcpMessage));
|
bytes = read(fd, packet, sizeof(struct dhcpMessage));
|
||||||
@ -36,6 +42,20 @@ int get_packet(struct dhcpMessage *packet, int fd)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
DEBUG(LOG_INFO, "oooooh!!! got some!");
|
DEBUG(LOG_INFO, "oooooh!!! got some!");
|
||||||
|
|
||||||
|
if (packet->op == BOOTREQUEST && (vendor = get_option(packet, DHCP_VENDOR))) {
|
||||||
|
for (i = 0; broken_vendors[i][0]; i++) {
|
||||||
|
if (vendor[OPT_LEN - 2] == (signed) strlen(broken_vendors[i]) &&
|
||||||
|
!strncmp(vendor, broken_vendors[i], vendor[OPT_LEN - 2]) &&
|
||||||
|
!(ntohs(packet->flags) & BROADCAST_FLAG)) {
|
||||||
|
DEBUG(LOG_INFO, "broken client (%s), forcing broadcast",
|
||||||
|
broken_vendors[i]);
|
||||||
|
packet->flags |= htons(BROADCAST_FLAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return bytes;
|
return bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,25 +46,6 @@ static int send_packet_to_client(struct dhcpMessage *payload, int force_broadcas
|
|||||||
{
|
{
|
||||||
u_int32_t ciaddr;
|
u_int32_t ciaddr;
|
||||||
char chaddr[6];
|
char chaddr[6];
|
||||||
int i;
|
|
||||||
char broken_vendors[][8] = {
|
|
||||||
"MSFT 98",
|
|
||||||
""
|
|
||||||
};
|
|
||||||
char *vendor;
|
|
||||||
|
|
||||||
if ((vendor = get_option(payload, DHCP_VENDOR))) {
|
|
||||||
for (i = 0; broken_vendors[i][0]; i++) {
|
|
||||||
if (vendor[OPT_LEN - 2] == (signed) strlen(broken_vendors[i]) &&
|
|
||||||
!strncmp(vendor, broken_vendors[i], vendor[OPT_LEN - 2]) &&
|
|
||||||
!(ntohs(payload->flags) & BROADCAST_FLAG)) {
|
|
||||||
DEBUG(LOG_INFO, "broken client (%s), forcing broadcast\n",
|
|
||||||
broken_vendors[i]);
|
|
||||||
payload->flags |= htons(BROADCAST_FLAG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (force_broadcast) {
|
if (force_broadcast) {
|
||||||
DEBUG(LOG_INFO, "broadcasting packet to client (NAK)");
|
DEBUG(LOG_INFO, "broadcasting packet to client (NAK)");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user