[libvirt] [PATCH v2] nwfilter: Also pick IP address from a DHCP ACK message

The local DHCP server on virtbr0 sends DHCP ACK messages when a VM is started and requests an IP address while the initial DHCP lease on the VM's MAC address hasn't expired. So, also pick the IP address of the VM if that type of message is seen. Thanks to Gerhard Stenzel for providing a test case for this. Changes from V1 to V2: - cleanup: replacing DHCP option numbers through constants Signed-off-by: Stefan Berger <stefanb@us.ibm.com> --- src/nwfilter/nwfilter_learnipaddr.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) Index: libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c =================================================================== --- libvirt-acl.orig/src/nwfilter/nwfilter_learnipaddr.c +++ libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c @@ -98,6 +98,11 @@ struct dhcp { } ATTRIBUTE_PACKED; #define DHCP_MSGT_DHCPOFFER 2 +#define DHCP_MSGT_DHCPACK 5 + + +#define DHCP_OPT_BCASTADDRESS 28 +#define DHCP_OPT_MESSAGETYPE 53 struct ether_vlan_header { @@ -336,17 +341,18 @@ procDHCPOpts(struct dhcp *dhcp, int dhcp switch (dhcpopt->code) { - case 28: /* Broadcast address */ + case DHCP_OPT_BCASTADDRESS: /* Broadcast address */ if (dhcp_opts_len >= 6) { uint32_t *tmp = (uint32_t *)&dhcpopt->value; (*bcastaddr) = ntohl(*tmp); } break; - case 53: /* Message type */ + case DHCP_OPT_MESSAGETYPE: /* Message type */ if (dhcp_opts_len >= 3) { uint8_t *val = (uint8_t *)&dhcpopt->value; switch (*val) { + case DHCP_MSGT_DHCPACK: case DHCP_MSGT_DHCPOFFER: *vmaddr = dhcp->yiaddr; *howDetected = DETECT_DHCP;

On Thu, Apr 29, 2010 at 09:39:15AM -0400, Stefan Berger wrote:
The local DHCP server on virtbr0 sends DHCP ACK messages when a VM is started and requests an IP address while the initial DHCP lease on the VM's MAC address hasn't expired. So, also pick the IP address of the VM if that type of message is seen. Thanks to Gerhard Stenzel for providing a test case for this.
Changes from V1 to V2: - cleanup: replacing DHCP option numbers through constants
Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
--- src/nwfilter/nwfilter_learnipaddr.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
Index: libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c =================================================================== --- libvirt-acl.orig/src/nwfilter/nwfilter_learnipaddr.c +++ libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c @@ -98,6 +98,11 @@ struct dhcp { } ATTRIBUTE_PACKED;
#define DHCP_MSGT_DHCPOFFER 2 +#define DHCP_MSGT_DHCPACK 5 + + +#define DHCP_OPT_BCASTADDRESS 28 +#define DHCP_OPT_MESSAGETYPE 53
struct ether_vlan_header { @@ -336,17 +341,18 @@ procDHCPOpts(struct dhcp *dhcp, int dhcp
switch (dhcpopt->code) {
- case 28: /* Broadcast address */ + case DHCP_OPT_BCASTADDRESS: /* Broadcast address */ if (dhcp_opts_len >= 6) { uint32_t *tmp = (uint32_t *)&dhcpopt->value; (*bcastaddr) = ntohl(*tmp); } break;
- case 53: /* Message type */ + case DHCP_OPT_MESSAGETYPE: /* Message type */ if (dhcp_opts_len >= 3) { uint8_t *val = (uint8_t *)&dhcpopt->value; switch (*val) { + case DHCP_MSGT_DHCPACK: case DHCP_MSGT_DHCPOFFER: *vmaddr = dhcp->yiaddr; *howDetected = DETECT_DHCP;
Okay, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

Daniel Veillard <veillard@redhat.com> wrote on 04/30/2010 07:50:02 AM:
Please respond to veillard
[...]
- case 53: /* Message type */ + case DHCP_OPT_MESSAGETYPE: /* Message type */ if (dhcp_opts_len >= 3) { uint8_t *val = (uint8_t *)&dhcpopt->value; switch (*val) { + case DHCP_MSGT_DHCPACK: case DHCP_MSGT_DHCPOFFER: *vmaddr = dhcp->yiaddr; *howDetected = DETECT_DHCP;
Okay, ACK,
Pushed. Thanks. Stefan
Daniel
-- Daniel Veillard | libxml Gnome XML XSLT toolkit
daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/
participants (2)
-
Daniel Veillard
-
Stefan Berger