blob: fcaa120ebeeab958bcb67285be91886c0652808e [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;
senthil7f2018e2023-06-21 22:00:44 +053021import java.util.Set;
karthik1977bc5ea1e2023-01-02 19:25:14 +053022import java.util.Optional;
23import java.util.concurrent.ConcurrentHashMap;
24import java.util.function.BiFunction;
senthil7f2018e2023-06-21 22:00:44 +053025import java.util.stream.Collectors;
karthik1977bc5ea1e2023-01-02 19:25:14 +053026
27import static org.onosproject.netflow.NetflowUtils.VAR_INT_LONG;
28import static org.onosproject.netflow.NetflowUtils.VAR_BYTE;
29import static org.onosproject.netflow.NetflowUtils.NULL;
30import static org.onosproject.netflow.NetflowUtils.VAR_SHORT;
senthil7f2018e2023-06-21 22:00:44 +053031import static org.onosproject.netflow.NetflowUtils.VAR_IPV4_ADDRESS;
32import static org.onosproject.netflow.NetflowUtils.VAR_IPV6_ADDRESS;
karthik1977bc5ea1e2023-01-02 19:25:14 +053033import static org.onosproject.netflow.NetflowUtils.VAR_SHORT_INT;
34import static org.onosproject.netflow.NetflowUtils.VAR_INT;
35import static org.onosproject.netflow.NetflowUtils.VAR_MAC;
senthil7f2018e2023-06-21 22:00:44 +053036import static org.onosproject.netflow.NetflowUtils.VAR_UNSIGNED_BYTE;
37import static org.onosproject.netflow.NetflowUtils.VAR_UNSIGNED_INT;
38import static org.onosproject.netflow.NetflowUtils.VAR_UNSIGNED_SHORT;;
karthik1977bc5ea1e2023-01-02 19:25:14 +053039
40/**
41 * The flow fields are a selection of Packet Header
42 * fields, lookup results (for example, the autonomous system numbers or
43 * the subnet masks), and properties of the packet such as length.
44 */
45public enum FlowField {
46
47 /**
48 * Flow field type definition reference.
49 * RFC reference :- rfc3954
50 * https://www.ietf.org/rfc/rfc3954.txt
51 * Section :- Field Type Definitions.
52 */
senthil7f2018e2023-06-21 22:00:44 +053053 IN_BYTES(1, VAR_UNSIGNED_INT),
54 IN_PKTS(2, VAR_UNSIGNED_INT),
karthik1977bc5ea1e2023-01-02 19:25:14 +053055 FLOWS(3, VAR_INT_LONG),
56 PROTOCOL(4, VAR_BYTE),
57 SRC_TOS(5, VAR_BYTE),
58 TCP_FLAGS(6, VAR_BYTE),
senthil7f2018e2023-06-21 22:00:44 +053059 L4_SRC_PORT(7, VAR_UNSIGNED_SHORT),
60 IPV4_SRC_ADDR(8, VAR_IPV4_ADDRESS),
karthik1977bc5ea1e2023-01-02 19:25:14 +053061 SRC_MASK(9, VAR_BYTE),
senthil7f2018e2023-06-21 22:00:44 +053062 INPUT_SNMP(10, VAR_UNSIGNED_SHORT),
63 L4_DST_PORT(11, VAR_UNSIGNED_SHORT),
64 IPV4_DST_ADDR(12, VAR_IPV4_ADDRESS),
karthik1977bc5ea1e2023-01-02 19:25:14 +053065 DST_MASK(13, VAR_BYTE),
senthil7f2018e2023-06-21 22:00:44 +053066 OUTPUT_SNMP(14, VAR_UNSIGNED_SHORT),
67 IPV4_NEXT_HOP(15, VAR_IPV4_ADDRESS),
karthik1977bc5ea1e2023-01-02 19:25:14 +053068 SRC_AS(16, VAR_SHORT_INT),
69 DST_AST(17, VAR_SHORT_INT),
senthil7f2018e2023-06-21 22:00:44 +053070 BGP_IPV4_NEXT_HOP(18, VAR_IPV4_ADDRESS),
karthik1977bc5ea1e2023-01-02 19:25:14 +053071 MUL_DST_PKTS(19, VAR_INT_LONG),
72 MUL_DST_BYTES(20, VAR_INT_LONG),
senthil7f2018e2023-06-21 22:00:44 +053073 LAST_SWITCHED(21, VAR_UNSIGNED_INT),
74 FIRST_SWITCHED(22, VAR_UNSIGNED_INT),
karthik1977bc5ea1e2023-01-02 19:25:14 +053075 OUT_BYTES(23, VAR_INT_LONG),
76 OUT_PKTS(24, VAR_INT_LONG),
77 MIN_PKT_LNGTH(25, NULL),
78 MAX_PKT_LNGTH(26, NULL),
senthil7f2018e2023-06-21 22:00:44 +053079 IPV6_SRC_ADDR(27, VAR_IPV6_ADDRESS),
80 IPV6_DST_ADDR(28, VAR_IPV6_ADDRESS),
karthik1977bc5ea1e2023-01-02 19:25:14 +053081 IPV6_SRC_MASK(29, VAR_BYTE),
82 IPV6_DST_MASK(30, VAR_BYTE),
83 IPV6_FLOW_LABEL(31, NULL),
84 ICMP_TYPE(32, VAR_SHORT),
85 MUL_IGMP_TYPE(33, VAR_BYTE),
86 SAMPLING_INTERVAL(34, VAR_INT),
87 SAMPLING_ALGORITHM(35, VAR_BYTE),
88 FLOW_ACTIVE_TIMEOUT(36, VAR_SHORT),
89 FLOW_INACTIVE_TIMEOUT(37, VAR_SHORT),
90 ENGINE_TYPE(38, VAR_BYTE),
91 ENGINE_ID(39, VAR_BYTE),
92 TOTAL_BYTES_EXP(40, VAR_INT_LONG),
93 TOTAL_PKTS_EXP(41, VAR_INT_LONG),
94 TOTAL_FLOWS_EXP(42, VAR_INT_LONG),
95 IPV4_SRC_PREFIX(44, NULL),
96 IPV4_DST_PREFIX(45, NULL),
97 MPLS_TOP_LABEL_TYPE(46, VAR_BYTE),
senthil7f2018e2023-06-21 22:00:44 +053098 MPLS_TOP_LABEL_IP_ADDR(47, VAR_IPV4_ADDRESS),
karthik1977bc5ea1e2023-01-02 19:25:14 +053099 FLOW_SAMPLER_ID(48, VAR_BYTE),
100 FLOW_SAMPLER_MODE(49, VAR_BYTE),
101 FLOW_SAMPLER_RANDOM_INTERVAL(50, NULL),
102 MIN_TTL(52, NULL),
103 MAX_TTL(53, NULL),
104 IPV4_IDENT(54, NULL),
105 DST_TOS(55, VAR_BYTE),
106 IN_SRC_MAC(56, VAR_MAC),
107 OUT_DST_MAC(57, VAR_MAC),
108 SRC_VLAN(58, VAR_SHORT),
109 DST_VLAN(59, VAR_SHORT),
senthil7f2018e2023-06-21 22:00:44 +0530110 IP_PROTOCOL_VERSION(60, VAR_UNSIGNED_BYTE),
karthik1977bc5ea1e2023-01-02 19:25:14 +0530111 DIRECTION(61, VAR_BYTE),
senthil7f2018e2023-06-21 22:00:44 +0530112 IPV6_NEXT_HOP(62, VAR_IPV6_ADDRESS),
113 BPG_IPV6_NEXT_HOP(63, VAR_IPV6_ADDRESS),
karthik1977bc5ea1e2023-01-02 19:25:14 +0530114 IPV6_OPTION_HEADERS(64, VAR_INT),
115 MPLS_LABEL_1(70, NULL),
116 MPLS_LABEL_2(71, NULL),
117 MPLS_LABEL_3(72, NULL),
118 MPLS_LABEL_4(73, NULL),
119 MPLS_LABEL_5(74, NULL),
120 MPLS_LABEL_6(75, NULL),
121 MPLS_LABEL_7(76, NULL),
122 MPLS_LABEL_8(77, NULL),
123 MPLS_LABEL_9(78, NULL),
124 MPLS_LABEL_10(79, NULL),
125 IN_DST_MAC(80, VAR_MAC),
126 OUT_SRC_MAC(81, VAR_MAC),
127 IF_NAME(82, NULL),
128 IF_DESC(83, NULL),
129 SAMPLER_NAME(84, NULL),
130 IN_PERMANENT_BYTES(85, NULL),
131 IN_PERMANENT_PKTS(86, NULL),
132 FRAGMENT_OFFSET(88, NULL),
133 FORWARDING_STATUS(89, NULL),
134 MPLS_PAL_RD(90, NULL),
135 MPLS_PREFIX_LEN(91, NULL),
136 SRC_TRAFFIC_INDEX(92, NULL),
137 DST_TRAFFIC_INDEX(93, NULL),
138 APPLICATION_DESCRIPTION(94, NULL),
139 APPLICATION_TAG(95, NULL),
140 APPLICATION_NAME(96, NULL),
141 POST_IP_DIFF_SERV_CODE_POINT(98, NULL),
142 REPLICATION_FACTOR(99, NULL),
143 DEPRECATED(100, NULL),
144 LAYER2_PACKET_SECTION_OFFSET(102, NULL),
145 LAYER2_PACKET_SECTION_SIZE(103, NULL),
146 LAYER2_PACKET_SECTION_DATA(104, NULL);
147
senthil7f2018e2023-06-21 22:00:44 +0530148
karthik1977bc5ea1e2023-01-02 19:25:14 +0530149 final int fieldID;
150 final BiFunction<ByteBuffer, Integer, Object> parser;
151 private static Map<Integer, FlowField> fields = new ConcurrentHashMap<>();
152
153 private FlowField(int fieldID, BiFunction<ByteBuffer, Integer, Object> parser) {
154 this.fieldID = fieldID;
155 this.parser = parser;
156 }
157
158 static {
159 Arrays.stream(FlowField.values()).forEach(f -> fields.put(f.fieldID, f));
160 }
161
162 public static Optional<FlowField> getField(int fieldId) {
163 return Optional.of(fieldId)
164 .filter(id -> fields.containsKey(id))
165 .map(id -> fields.get(id));
166 }
167
senthil7f2018e2023-06-21 22:00:44 +0530168 public static Set<String> getAllFlowField() {
169 return fields.values().stream()
170 .map(f -> f.name())
171 .collect(Collectors.toSet());
172 }
173
karthik1977bc5ea1e2023-01-02 19:25:14 +0530174 public BiFunction<ByteBuffer, Integer, Object> getParser() {
175 return this.parser;
176 }
177
178}