[libvirt] [libvirt PATCHv7 1/1] add DHCP snooping
Daniel P. Berrange
berrange at redhat.com
Tue Mar 27 09:24:22 UTC 2012
On Mon, Mar 26, 2012 at 01:25:48PM -0700, David L Stevens wrote:
> This patch adds DHCP snooping support to libvirt. The learning method for
> IP addresses is specified by setting the "ip_learning" variable to one of
> "any" [default] (existing IP learning code), "none" (static only addresses)
> or "dhcp" (DHCP snooping).
>
> Active leases are saved in a lease file and reloaded on restart or HUP.
>
> Changes since v6:
> - replace pthread_cancel() with synchronous cancelation method
>
> Signed-off-by: David L Stevens <dlstevens at us.ibm.com>
> ---
> docs/formatnwfilter.html.in | 17 +
> src/Makefile.am | 2 +
> src/nwfilter/nwfilter_dhcpsnoop.c | 1139 ++++++++++++++++++++++++++++++++
> src/nwfilter/nwfilter_dhcpsnoop.h | 38 ++
> src/nwfilter/nwfilter_driver.c | 6 +
> src/nwfilter/nwfilter_gentech_driver.c | 59 ++-
> 6 files changed, 1248 insertions(+), 13 deletions(-)
> create mode 100644 src/nwfilter/nwfilter_dhcpsnoop.c
> create mode 100644 src/nwfilter/nwfilter_dhcpsnoop.h
>
> diff --git a/docs/formatnwfilter.html.in b/docs/formatnwfilter.html.in
> index 9cb7644..ad10765 100644
> --- a/docs/formatnwfilter.html.in
> +++ b/docs/formatnwfilter.html.in
> diff --git a/src/nwfilter/nwfilter_dhcpsnoop.c b/src/nwfilter/nwfilter_dhcpsnoop.c
> new file mode 100644
> index 0000000..8e5dcc5
> --- /dev/null
> +++ b/src/nwfilter/nwfilter_dhcpsnoop.c
> +#ifdef HAVE_LIBPCAP
> +
> +#define LEASEFILE LOCALSTATEDIR "/run/libvirt/network/nwfilter.leases"
> +#define TMPLEASEFILE LOCALSTATEDIR "/run/libvirt/network/nwfilter.ltmp"
> +static int lease_fd = -1;
> +static int nleases = 0; /* number of active leases */
> +static int wleases = 0; /* number of written leases */
> +
> +static virHashTablePtr SnoopReqs;
> +static virHashTablePtr IfnameToKey;
> +static pthread_mutex_t SnoopLock = PTHREAD_MUTEX_INITIALIZER;
> +
> +/* snooper thread management */
> +
> +static virHashTablePtr Active;
> +static pthread_mutex_t ActiveLock = PTHREAD_MUTEX_INITIALIZER;
I'd prefer to see all these random variables put into a
'struct virNWFilterSnoopState', and have a single global
variable, or even better, pass an instance of the struct
into the methods that require it.
> +SnoopActivate(pthread_t thread)
> +SnoopCancel(char **ThreadKey)
> +SnoopIsActive(char *ThreadKey)
> +#define snoop_lock() { pthread_mutex_lock(&SnoopLock); }
> +#define snoop_unlock() { pthread_mutex_unlock(&SnoopLock); }
> +struct iplease {
> +static struct iplease *ipl_getbyip(struct iplease *start, uint32_t ipaddr);
> +static void ipl_update(struct iplease *pl, uint32_t timeout);
> +static struct virNWFilterSnoopReq *newreq(const char *ifkey);
> +static void lease_open(void);
> +static void lease_close(void);
> +static void lease_load(void);
> +static void lease_save(struct iplease *ipl);
> +static void lease_restore(struct virNWFilterSnoopReq *req);
> +static void lease_refresh(void);
> +ipl_ladd(struct iplease *plnew, struct iplease **start, struct iplease **end)
> +ipl_tadd(struct iplease *plnew)
> +ipl_install(struct iplease *ipl)
> +ipl_add(struct iplease *plnew, bool update_leasefile)
> +ipl_ldel(struct iplease *ipl, struct iplease **start, struct iplease **end)
> +ipl_tdel(struct iplease *ipl)
> +ipl_del(struct virNWFilterSnoopReq *req, uint32_t ipaddr, bool update_leasefile)
> +ipl_update(struct iplease *ipl, uint32_t timeout)
> +ipl_getbyip(struct iplease *start, uint32_t ipaddr)
> +ipl_trun(struct virNWFilterSnoopReq *req)
> +struct eth {
> +struct dhcp {
> +dhcp_getopt(struct dhcp *pd, int len, int *pmtype, int *pleasetime)
> +dhcpdecode(struct virNWFilterSnoopReq *req, struct eth *pep, int len)
> +dhcpopen(const char *intf)
> +snoopReqFree(struct virNWFilterSnoopReq *req)
> +virNWFilterDHCPSnoop(void *req0)
> +ifkeyFormat(char *ifkey, const unsigned char *vmuuid,
> + unsigned const char *macaddr)
> +virNWFilterDHCPSnoopReq(virNWFilterTechDriverPtr techdriver,
> + const char *ifname,
> + const char *linkdev,
> + enum virDomainNetType nettype,
> + const unsigned char *vmuuid,
> + const unsigned char *macaddr,
> + const char *filtername,
> + virNWFilterHashTablePtr filterparams,
> + virNWFilterDriverStatePtr driver)
> +freeReq(void *req0, const void *name ATTRIBUTE_UNUSED)
> +lease_close(void)
> +lease_open(void)
> +virNWFilterDHCPSnoopInit(void)
> +virNWFilterDHCPSnoopEnd(const char *ifname)
> +lease_write(int lfd, const char *ifkey, struct iplease *ipl)
> +lease_save(struct iplease *ipl)
> +newreq(const char *ifkey)
> +SaveSnoopReqIter(void *payload,
> + const void *name ATTRIBUTE_UNUSED,
> + void *data)
> +lease_refresh(void)
> +lease_load(void)
> +lease_restore(struct virNWFilterSnoopReq *req)
The number of different function / struct naming schemes used here
is out of control. Please change everything to use 'virNWFilter'
or 'virNWFilterDHCPSnoop' as a prefix, and avoid '_' in function
or struct names.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list