diff --git a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/BufferUtils.java b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/BufferUtils.java index 3f965a35b2ea..c7f7fb99afe8 100644 --- a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/BufferUtils.java +++ b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/BufferUtils.java @@ -53,7 +53,7 @@ public static ByteBuffer slice(final ByteBuffer buffer, final int size) { } public static UnsignedLong uint(final ByteBuffer buffer, final int octets) { - Preconditions.checkArgument(octets > 0 && octets < 9); + Preconditions.checkArgument(0 <= octets && octets <= 8); long result = 0; @@ -65,7 +65,7 @@ public static UnsignedLong uint(final ByteBuffer buffer, final int octets) { } public static Long sint(final ByteBuffer buffer, final int octets) { - Preconditions.checkArgument(octets > 0 && octets < 9); + Preconditions.checkArgument(0 <= octets && octets <= 8); long result = buffer.get() & 0xFFL; boolean s = (result & 0x80L) != 0; diff --git a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/PacketHandler.java b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/PacketHandler.java index d2d1e9e6326f..77e8a31c8887 100644 --- a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/PacketHandler.java +++ b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/PacketHandler.java @@ -49,6 +49,7 @@ import org.opennms.netmgt.telemetry.listeners.flow.ie.values.IPv6AddressValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.ListValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.MacAddressValue; +import org.opennms.netmgt.telemetry.listeners.flow.ie.values.NullValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.OctetArrayValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.SignedValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.StringValue; @@ -143,6 +144,11 @@ private Flows.Entry.Builder buildEntry(final String name, final Optional enterpriseNumber, - final Integer informationElementNumber, + final int informationElementNumber, final ValueParserFactory parserFactory, final String name, final Optional semantics) { @@ -84,7 +85,7 @@ default void add(final Protocol protocol, } default void add(final Protocol protocol, - final Integer informationElementNumber, + final int informationElementNumber, final ValueParserFactory parserFactory, final String name, final Optional semantics) { @@ -92,7 +93,7 @@ default void add(final Protocol protocol, } default void add(final Protocol protocol, - final Integer informationElementNumber, + final int informationElementNumber, final ValueParserFactory parserFactory, final String name, final Semantics semantics) { @@ -112,6 +113,12 @@ public interface Provider { private InformationElementDatabase(final Provider... providers) { final AdderImpl adder = new AdderImpl(); + + // Add null element - this derives from the standard but is required by some exporters + adder.add(Protocol.NETFLOW9, 0, NullValue::parser, "null", Optional.empty()); + adder.add(Protocol.IPFIX, 0, NullValue::parser, "null", Optional.empty()); + + // Load providers for (final Provider provider : providers) { provider.load(adder); } diff --git a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ie/Value.java b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ie/Value.java index d1df100fe098..32ff4af4732d 100644 --- a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ie/Value.java +++ b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ie/Value.java @@ -38,6 +38,7 @@ import org.opennms.netmgt.telemetry.listeners.flow.ie.values.IPv6AddressValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.ListValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.MacAddressValue; +import org.opennms.netmgt.telemetry.listeners.flow.ie.values.NullValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.OctetArrayValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.SignedValue; import org.opennms.netmgt.telemetry.listeners.flow.ie.values.StringValue; @@ -47,6 +48,8 @@ public abstract class Value { public interface Visitor { + void accept(final NullValue value); + void accept(final BooleanValue value); void accept(final DateTimeValue value); diff --git a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ie/values/NullValue.java b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ie/values/NullValue.java new file mode 100644 index 000000000000..ae7906809541 --- /dev/null +++ b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ie/values/NullValue.java @@ -0,0 +1,85 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2017 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2017 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.netmgt.telemetry.listeners.flow.ie.values; + +import java.nio.ByteBuffer; +import java.util.Optional; + +import org.opennms.netmgt.telemetry.listeners.flow.InvalidPacketException; +import org.opennms.netmgt.telemetry.listeners.flow.ie.InformationElement; +import org.opennms.netmgt.telemetry.listeners.flow.ie.Semantics; +import org.opennms.netmgt.telemetry.listeners.flow.ie.Value; +import org.opennms.netmgt.telemetry.listeners.flow.session.TemplateManager; + +import com.google.common.base.MoreObjects; + +public class NullValue extends Value { + public NullValue(final String name, + final Optional semantics) { + super(name, semantics); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("name", getName()) + .add("value", "(null)") + .toString(); + } + + public static InformationElement parser(final String name, final Optional semantics) { + return new InformationElement() { + @Override + public Value parse(final TemplateManager.TemplateResolver templateResolver, + final ByteBuffer buffer) throws InvalidPacketException { + return new NullValue(name, semantics); + } + + @Override + public int getMaximumFieldLength() { + return 0; + } + + @Override + public int getMinimumFieldLength() { + return 0; + } + }; + } + + @Override + public Void getValue() { + return null; + } + + @Override + public void visit(final Visitor visitor) { + visitor.accept(this); + } +} diff --git a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ipfix/proto/FieldSpecifier.java b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ipfix/proto/FieldSpecifier.java index 80bd34b45d8c..00c947a5e716 100644 --- a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ipfix/proto/FieldSpecifier.java +++ b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/ipfix/proto/FieldSpecifier.java @@ -89,10 +89,6 @@ public FieldSpecifier(final ByteBuffer buffer) throws InvalidPacketException { this.specifier = new EnterpriseField(this.fieldLength, this.informationElementId, enterpriseNumber); } - - if (this.fieldLength < 1) { - throw new InvalidPacketException("Zero-sized field"); - } } @Override diff --git a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/netflow9/proto/FieldSpecifier.java b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/netflow9/proto/FieldSpecifier.java index a7ccc90ffc5c..d8dcd96738b9 100644 --- a/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/netflow9/proto/FieldSpecifier.java +++ b/features/telemetry/listeners/flow/src/main/java/org/opennms/netmgt/telemetry/listeners/flow/netflow9/proto/FieldSpecifier.java @@ -73,10 +73,6 @@ public FieldSpecifier(final ByteBuffer buffer) throws InvalidPacketException { } this.specifier = new StandardField(this.fieldLength, informationElement); - - if (this.fieldLength < 1) { - throw new InvalidPacketException("Zero-sized field"); - } } @Override