[libvirt] [PATCH] nwfilter: Add support for icmpv6 filtering
Ján Tomko
jtomko at redhat.com
Mon Dec 8 10:00:56 UTC 2014
On 11/26/2014 10:02 PM, Stefan Berger wrote:
> Make use of the ebtables functionality to be able to filter certain
> parameters of icmpv6 packets. Extend the XML parser for icmpv6 types,
> type ranges, codes, and code ranges. Extend the nwfilter documentation,
> schema, and test cases.
>
> Being able to filter icmpv6 types and codes helps extending the DHCP
> snooper for IPv6 and filtering at least some parameters of IPv6's NDP
> (Neighbor Discovery Protocol) packets. However, the filtering will not
> be as good as the filtering of ARP packets since we cannot check on IP
> addresses in the payload of the NDP packets.
>
> Signed-off-by: Stefan Berger stefanb at linux.vnet.ibm.com
> ---
> docs/formatnwfilter.html.in | 20 +++++++
> docs/schemas/nwfilter.rng | 26 +++++++++
> src/conf/nwfilter_conf.c | 26 +++++++++
> src/conf/nwfilter_conf.h | 4 ++
> src/nwfilter/nwfilter_ebiptables_driver.c | 80 ++++++++++++++++++++++++++
> tests/nwfilterxml2firewalldata/ipv6-linux.args | 16 ++++++
> tests/nwfilterxml2firewalldata/ipv6.xml | 38 ++++++++++++
> tests/nwfilterxml2xmlin/ipv6-test.xml | 38 ++++++++++++
> tests/nwfilterxml2xmlout/ipv6-test.xml | 12 ++++
> 9 files changed, 260 insertions(+)
>
> diff --git a/docs/formatnwfilter.html.in b/docs/formatnwfilter.html.in
> index 073b852..7c0dd5b 100644
> diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
> index 074d745..0108dbe 100644
> --- a/src/conf/nwfilter_conf.c
> +++ b/src/conf/nwfilter_conf.c
> @@ -1445,6 +1445,26 @@ static const virXMLAttr2Struct ipv6Attributes[] = {
> .datatype = DATATYPE_UINT16 | DATATYPE_UINT16_HEX,
> .dataIdx = offsetof(virNWFilterRuleDef, p.ipv6HdrFilter.portData.dataDstPortEnd),
> },
> + {
> + .name = "type",
> + .datatype = DATATYPE_UINT8 | DATATYPE_UINT8_HEX,
> + .dataIdx = offsetof(virNWFilterRuleDef, p.ipv6HdrFilter.dataICMPTypeStart),
> + },
> + {
> + .name = "typeend",
> + .datatype = DATATYPE_UINT8 | DATATYPE_UINT8_HEX,
> + .dataIdx = offsetof(virNWFilterRuleDef, p.ipv6HdrFilter.dataICMPTypeEnd),
> + },
> + {
> + .name = "code",
> + .datatype = DATATYPE_UINT8 | DATATYPE_UINT8_HEX,
> + .dataIdx = offsetof(virNWFilterRuleDef, p.ipv6HdrFilter.dataICMPCodeStart),
> + },
> + {
> + .name = "codeend",
> + .datatype = DATATYPE_UINT8 | DATATYPE_UINT8_HEX,
> + .dataIdx = offsetof(virNWFilterRuleDef, p.ipv6HdrFilter.dataICMPCodeEnd),
> + },
> COMMENT_PROP_IPHDR(ipv6HdrFilter),
> {
> .name = NULL,
> @@ -2219,6 +2239,12 @@ virNWFilterRuleDefFixup(virNWFilterRuleDefPtr rule)
> rule->p.ipv6HdrFilter.ipHdr.dataSrcIPAddr);
> COPY_NEG_SIGN(rule->p.ipv6HdrFilter.ipHdr.dataDstIPMask,
> rule->p.ipv6HdrFilter.ipHdr.dataDstIPAddr);
> + COPY_NEG_SIGN(rule->p.icmpHdrFilter.dataICMPTypeend,
> + rule->p.icmpHdrFilter.dataICMPType);
> + COPY_NEG_SIGN(rule->p.icmpHdrFilter.dataICMPCode,
> + rule->p.icmpHdrFilter.dataICMPType);
> + COPY_NEG_SIGN(rule->p.icmpHdrFilter.dataICMPCodeend,
> + rule->p.icmpHdrFilter.dataICMPType);
This doesn't compile for me.
> virNWFilterRuleDefFixupIPSet(&rule->p.ipv6HdrFilter.ipHdr);
> break;
>
> diff --git a/src/conf/nwfilter_conf.h b/src/conf/nwfilter_conf.h
> index f81df60..6e68ecc 100644
> --- a/src/conf/nwfilter_conf.h
> +++ b/src/conf/nwfilter_conf.h
> @@ -265,6 +265,10 @@ struct _ipv6HdrFilterDef {
> ethHdrDataDef ethHdr;
> ipHdrDataDef ipHdr;
> portDataDef portData;
> + nwItemDesc dataICMPTypeStart;
> + nwItemDesc dataICMPTypeEnd;
> + nwItemDesc dataICMPCodeStart;
> + nwItemDesc dataICMPCodeEnd;
> };
>
>
> diff --git a/src/nwfilter/nwfilter_ebiptables_driver.c b/src/nwfilter/nwfilter_ebiptables_driver.c
> index 377b59b..d7a94ee 100644
> --- a/src/nwfilter/nwfilter_ebiptables_driver.c
> +++ b/src/nwfilter/nwfilter_ebiptables_driver.c
> @@ -1826,6 +1826,7 @@ ebtablesCreateRuleInstance(virFirewallPtr fw,
> bool hasMask = false;
> virFirewallRulePtr fwrule;
> int ret = -1;
> + virBuffer buf = VIR_BUFFER_INITIALIZER;
>
> if (STREQ(chainSuffix,
> virNWFilterChainSuffixTypeToString(
> @@ -2342,6 +2343,83 @@ ebtablesCreateRuleInstance(virFirewallPtr fw,
> virFirewallRuleAddArg(fw, fwrule, number);
> }
> }
> +
> + if (HAS_ENTRY_ITEM(&rule->p.ipv6HdrFilter.dataICMPTypeStart) ||
> + HAS_ENTRY_ITEM(&rule->p.ipv6HdrFilter.dataICMPTypeEnd) ||
> + HAS_ENTRY_ITEM(&rule->p.ipv6HdrFilter.dataICMPCodeStart) ||
> + HAS_ENTRY_ITEM(&rule->p.ipv6HdrFilter.dataICMPCodeEnd) ) {
> + bool lo = false;
> + char *r;
> +
> + virFirewallRuleAddArg(fw, fwrule,
> + "--ip6-icmp-type");
> +
> + if (HAS_ENTRY_ITEM(&rule->p.ipv6HdrFilter.dataICMPTypeStart)) {
> + if (printDataType(vars,
> + number, sizeof(number),
> + &rule->p.ipv6HdrFilter.dataICMPTypeStart) < 0)
> + goto cleanup;
> + lo = true;
> + } else {
> + ignore_value(virStrcpyStatic(number, "0"));
> + }
> +
> + virBufferStrcat(&buf, number, ":", NULL);
> +
> + if HAS_ENTRY_ITEM(&rule->p.ipv6HdrFilter.dataICMPTypeEnd) {
I'd rather put parentheses around the macros.
Otherwise looks good to me.
Jan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141208/e0edfbec/attachment-0001.sig>
More information about the libvir-list
mailing list