udhcpsnoop: look at more options for the cache expiry

make the code look for leasetime, rebind and renew options to
determine the cache expiry time.

Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
John Crispin
2022-08-16 17:57:46 +02:00
parent 7ef10fcfb4
commit 098c81376f

View File

@@ -6,10 +6,11 @@
#include "dhcpsnoop.h"
#include "msg.h"
const char *dhcpsnoop_parse_ipv4(const void *buf, size_t len, uint16_t port, uint32_t *rebind)
const char *dhcpsnoop_parse_ipv4(const void *buf, size_t len, uint16_t port, uint32_t *expire)
{
const struct dhcpv4_message *msg = buf;
const uint8_t *pos, *end;
uint32_t leasetime = 0, rebind = 0, renew = 0;
char type = 0;
if (port != 67 && port != 68)
@@ -46,14 +47,32 @@ const char *dhcpsnoop_parse_ipv4(const void *buf, size_t len, uint16_t port, uin
continue;
type = opt[2];
break;
case DHCPV4_OPT_LEASETIME:
if (opt[1] != 4)
leasetime = *((uint32_t *) &opt[2]);
break;
case DHCPV4_OPT_REBIND:
if (!rebind || opt[1] != 4)
if (opt[1] != 4)
continue;
*rebind = *((uint32_t *) &opt[2]);
rebind = *((uint32_t *) &opt[2]);
break;
case DHCPV4_OPT_RENEW:
if (opt[1] != 4)
continue;
renew = *((uint32_t *) &opt[2]);
break;
}
}
if (renew)
*expire = renew;
else if (rebind)
*expire = rebind;
else if (leasetime)
*expire = leasetime;
else
*expire = 24 * 60;
switch(type) {
case DHCPV4_MSG_ACK:
return "ack";