diff --git a/src/Makefile.am b/src/Makefile.am index cec478948a..fef3917248 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -104,6 +104,7 @@ UTIL_SOURCES = \ util/virnetdevopenvswitch.h util/virnetdevopenvswitch.c \ util/virnetdevtap.h util/virnetdevtap.c \ util/virnetdevveth.h util/virnetdevveth.c \ + util/virnetdevvlan.h util/virnetdevvlan.c \ util/virnetdevvportprofile.h util/virnetdevvportprofile.c \ util/virnetlink.c util/virnetlink.h \ util/virrandom.h util/virrandom.c \ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e5d358220c..2c95f943f1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1431,6 +1431,12 @@ virNetDevVethCreate; virNetDevVethDelete; +# virnetdevvlan.h +virNetDevVlanClear; +virNetDevVlanCopy; +virNetDevVlanEqual; +virNetDevVlanFree; + # virnetdevvportprofile.h virNetDevVPortProfileAssociate; virNetDevVPortProfileCheckComplete; diff --git a/src/util/virnetdevvlan.c b/src/util/virnetdevvlan.c new file mode 100644 index 0000000000..52349af64a --- /dev/null +++ b/src/util/virnetdevvlan.c @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2009-2012 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see + * . + * + * Authors: + * Laine Stump + */ + +#include + +#include "internal.h" +#include "virterror_internal.h" +#include "virnetdevvlan.h" +#include "memory.h" + +#define VIR_FROM_THIS VIR_FROM_NONE + +void +virNetDevVlanClear(virNetDevVlanPtr vlan) +{ + VIR_FREE(vlan->tag); + vlan->nTags = 0; +} + +void +virNetDevVlanFree(virNetDevVlanPtr vlan) +{ + if (vlan) + virNetDevVlanClear(vlan); + VIR_FREE(vlan); +} + +int +virNetDevVlanEqual(const virNetDevVlanPtr a, const virNetDevVlanPtr b) +{ + int ai, bi; + + if (!(a || b)) + return true; + if (!a || !b) + return false; + + if (a->trunk != b->trunk || + a->nTags != b->nTags) { + return false; + } + + for (ai = 0; ai < a->nTags; ai++) { + for (bi = 0; bi < b->nTags; bi++) { + if (a->tag[ai] == b->tag[bi]) + break; + } + if (bi >= b->nTags) { + /* no matches for a->tag[ai] anywhere in b->tag */ + return false; + } + } + return true; +} + +/* + * virNetDevVlanCopy - copy from src into (already existing) dst. + * If src is NULL, dst will have nTags set to 0. + * dst is assumed to be empty on entry. + */ +int +virNetDevVlanCopy(virNetDevVlanPtr dst, const virNetDevVlanPtr src) +{ + if (!src || src->nTags == 0) + return 0; + + if (VIR_ALLOC_N(dst->tag, src->nTags) < 0) { + virReportOOMError(); + return -1; + } + + dst->trunk = src->trunk; + dst->nTags = src->nTags; + memcpy(dst->tag, src->tag, src->nTags * sizeof(*src->tag)); + return 0; +} diff --git a/src/util/virnetdevvlan.h b/src/util/virnetdevvlan.h new file mode 100644 index 0000000000..7a046f924e --- /dev/null +++ b/src/util/virnetdevvlan.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2009-2012 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see + * . + * + * Authors: + * Laine Stump + */ + +#ifndef __VIR_NETDEV_VLAN_H__ +# define __VIR_NETDEV_VLAN_H__ + +typedef struct _virNetDevVlan virNetDevVlan; +typedef virNetDevVlan *virNetDevVlanPtr; +struct _virNetDevVlan { + bool trunk; /* true if this is a trunk */ + int nTags; /* number of tags in array */ + unsigned int *tag; /* pointer to array of tags */ +}; + +void virNetDevVlanClear(virNetDevVlanPtr vlan); +void virNetDevVlanFree(virNetDevVlanPtr vlan); +int virNetDevVlanEqual(const virNetDevVlanPtr a, const virNetDevVlanPtr b); +int virNetDevVlanCopy(virNetDevVlanPtr dst, const virNetDevVlanPtr src); + +#endif /* __VIR_NETDEV_VLAN_H__ */