blob: 207903cb370ad009a4a5fc9c386ae932350d878f [file] [log] [blame]
karthik1977bc5ea1e2023-01-02 19:25:14 +05301/*
2 * Copyright 2023-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.netflow;
17
18import java.nio.ByteBuffer;
19import java.util.Arrays;
20import java.util.Map;
21import java.util.Optional;
22import java.util.concurrent.ConcurrentHashMap;
23import java.util.function.BiFunction;
24
25import static org.onosproject.netflow.NetflowUtils.VAR_INT_LONG;
26import static org.onosproject.netflow.NetflowUtils.VAR_BYTE;
27import static org.onosproject.netflow.NetflowUtils.NULL;
28import static org.onosproject.netflow.NetflowUtils.VAR_SHORT;
29import static org.onosproject.netflow.NetflowUtils.VAR_IP_ADDRESS;
30import static org.onosproject.netflow.NetflowUtils.VAR_SHORT_INT;
31import static org.onosproject.netflow.NetflowUtils.VAR_INT;
32import static org.onosproject.netflow.NetflowUtils.VAR_MAC;
33
34/**
35 * The flow fields are a selection of Packet Header
36 * fields, lookup results (for example, the autonomous system numbers or
37 * the subnet masks), and properties of the packet such as length.
38 */
39public enum FlowField {
40
41 /**
42 * Flow field type definition reference.
43 * RFC reference :- rfc3954
44 * https://www.ietf.org/rfc/rfc3954.txt
45 * Section :- Field Type Definitions.
46 */
47 IN_BYTES(1, VAR_INT_LONG),
48 IN_PKTS(2, VAR_INT_LONG),
49 FLOWS(3, VAR_INT_LONG),
50 PROTOCOL(4, VAR_BYTE),
51 SRC_TOS(5, VAR_BYTE),
52 TCP_FLAGS(6, VAR_BYTE),
53 L4_SRC_PORT(7, VAR_SHORT),
54 IPV4_SRC_ADDR(8, VAR_IP_ADDRESS),
55 SRC_MASK(9, VAR_BYTE),
56 INPUT_SNMP(10, VAR_SHORT_INT),
57 L4_DST_PORT(11, VAR_SHORT),
58 IPV4_DST_ADDR(12, VAR_IP_ADDRESS),
59 DST_MASK(13, VAR_BYTE),
60 OUTPUT_SNMP(14, VAR_SHORT_INT),
61 IPV4_NEXT_HOP(15, VAR_IP_ADDRESS),
62 SRC_AS(16, VAR_SHORT_INT),
63 DST_AST(17, VAR_SHORT_INT),
64 BGP_IPV4_NEXT_HOP(18, VAR_IP_ADDRESS),
65 MUL_DST_PKTS(19, VAR_INT_LONG),
66 MUL_DST_BYTES(20, VAR_INT_LONG),
67 LAST_SWITCHED(21, VAR_INT),
68 FIRST_SWITCHED(22, VAR_INT),
69 OUT_BYTES(23, VAR_INT_LONG),
70 OUT_PKTS(24, VAR_INT_LONG),
71 MIN_PKT_LNGTH(25, NULL),
72 MAX_PKT_LNGTH(26, NULL),
73 IPV6_SRC_ADDR(27, VAR_IP_ADDRESS),
74 IPV6_DST_ADDR(28, VAR_IP_ADDRESS),
75 IPV6_SRC_MASK(29, VAR_BYTE),
76 IPV6_DST_MASK(30, VAR_BYTE),
77 IPV6_FLOW_LABEL(31, NULL),
78 ICMP_TYPE(32, VAR_SHORT),
79 MUL_IGMP_TYPE(33, VAR_BYTE),
80 SAMPLING_INTERVAL(34, VAR_INT),
81 SAMPLING_ALGORITHM(35, VAR_BYTE),
82 FLOW_ACTIVE_TIMEOUT(36, VAR_SHORT),
83 FLOW_INACTIVE_TIMEOUT(37, VAR_SHORT),
84 ENGINE_TYPE(38, VAR_BYTE),
85 ENGINE_ID(39, VAR_BYTE),
86 TOTAL_BYTES_EXP(40, VAR_INT_LONG),
87 TOTAL_PKTS_EXP(41, VAR_INT_LONG),
88 TOTAL_FLOWS_EXP(42, VAR_INT_LONG),
89 IPV4_SRC_PREFIX(44, NULL),
90 IPV4_DST_PREFIX(45, NULL),
91 MPLS_TOP_LABEL_TYPE(46, VAR_BYTE),
92 MPLS_TOP_LABEL_IP_ADDR(47, VAR_IP_ADDRESS),
93 FLOW_SAMPLER_ID(48, VAR_BYTE),
94 FLOW_SAMPLER_MODE(49, VAR_BYTE),
95 FLOW_SAMPLER_RANDOM_INTERVAL(50, NULL),
96 MIN_TTL(52, NULL),
97 MAX_TTL(53, NULL),
98 IPV4_IDENT(54, NULL),
99 DST_TOS(55, VAR_BYTE),
100 IN_SRC_MAC(56, VAR_MAC),
101 OUT_DST_MAC(57, VAR_MAC),
102 SRC_VLAN(58, VAR_SHORT),
103 DST_VLAN(59, VAR_SHORT),
104 IP_PROTOCOL_VERSION(60, VAR_BYTE),
105 DIRECTION(61, VAR_BYTE),
106 IPV6_NEXT_HOP(62, VAR_IP_ADDRESS),
107 BPG_IPV6_NEXT_HOP(63, VAR_IP_ADDRESS),
108 IPV6_OPTION_HEADERS(64, VAR_INT),
109 MPLS_LABEL_1(70, NULL),
110 MPLS_LABEL_2(71, NULL),
111 MPLS_LABEL_3(72, NULL),
112 MPLS_LABEL_4(73, NULL),
113 MPLS_LABEL_5(74, NULL),
114 MPLS_LABEL_6(75, NULL),
115 MPLS_LABEL_7(76, NULL),
116 MPLS_LABEL_8(77, NULL),
117 MPLS_LABEL_9(78, NULL),
118 MPLS_LABEL_10(79, NULL),
119 IN_DST_MAC(80, VAR_MAC),
120 OUT_SRC_MAC(81, VAR_MAC),
121 IF_NAME(82, NULL),
122 IF_DESC(83, NULL),
123 SAMPLER_NAME(84, NULL),
124 IN_PERMANENT_BYTES(85, NULL),
125 IN_PERMANENT_PKTS(86, NULL),
126 FRAGMENT_OFFSET(88, NULL),
127 FORWARDING_STATUS(89, NULL),
128 MPLS_PAL_RD(90, NULL),
129 MPLS_PREFIX_LEN(91, NULL),
130 SRC_TRAFFIC_INDEX(92, NULL),
131 DST_TRAFFIC_INDEX(93, NULL),
132 APPLICATION_DESCRIPTION(94, NULL),
133 APPLICATION_TAG(95, NULL),
134 APPLICATION_NAME(96, NULL),
135 POST_IP_DIFF_SERV_CODE_POINT(98, NULL),
136 REPLICATION_FACTOR(99, NULL),
137 DEPRECATED(100, NULL),
138 LAYER2_PACKET_SECTION_OFFSET(102, NULL),
139 LAYER2_PACKET_SECTION_SIZE(103, NULL),
140 LAYER2_PACKET_SECTION_DATA(104, NULL);
141
142 final int fieldID;
143 final BiFunction<ByteBuffer, Integer, Object> parser;
144 private static Map<Integer, FlowField> fields = new ConcurrentHashMap<>();
145
146 private FlowField(int fieldID, BiFunction<ByteBuffer, Integer, Object> parser) {
147 this.fieldID = fieldID;
148 this.parser = parser;
149 }
150
151 static {
152 Arrays.stream(FlowField.values()).forEach(f -> fields.put(f.fieldID, f));
153 }
154
155 public static Optional<FlowField> getField(int fieldId) {
156 return Optional.of(fieldId)
157 .filter(id -> fields.containsKey(id))
158 .map(id -> fields.get(id));
159 }
160
161 public BiFunction<ByteBuffer, Integer, Object> getParser() {
162 return this.parser;
163 }
164
165}