Skip to content

Commit dac4c08

Browse files
mikemiles-devMichael Mileusnich
and
Michael Mileusnich
authored
WIP: Cleanup ipfix fields fn (#38)
* Cleanup ipfix fields fn --------- Co-authored-by: Michael Mileusnich <[email protected]>
1 parent 40ea365 commit dac4c08

File tree

1 file changed

+32
-32
lines changed

1 file changed

+32
-32
lines changed

src/variable_versions/ipfix.rs

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,10 @@ pub struct TemplateField {
157157
}
158158

159159
fn set_entperprise_field(field_type: IPFixField, enterprise_number: Option<u32>) -> IPFixField {
160-
match enterprise_number {
161-
Some(_) => IPFixField::Enterprise,
162-
None => field_type,
160+
if enterprise_number.is_some() {
161+
IPFixField::Enterprise
162+
} else {
163+
field_type
163164
}
164165
}
165166

@@ -170,9 +171,7 @@ fn parse_options_template(i: &[u8], length: u16) -> IResult<&[u8], OptionsTempla
170171
Ok((remaining, option_template))
171172
}
172173

173-
// Hacky way when using Template as generic T to cast to a common field type.
174-
// We use OptionsTemplateField as it is the same as type Template Field but
175-
// with enterprise_field. In TemplateField tpe enterprise_field is just None.
174+
// Common trait for both templates. Mainly for fetching fields.
176175
trait CommonTemplate {
177176
fn get_fields(&self) -> &Vec<TemplateField>;
178177
}
@@ -196,47 +195,48 @@ fn parse_fields<'a, T: CommonTemplate>(
196195
i: &'a [u8],
197196
template: Option<&T>,
198197
) -> IResult<&'a [u8], Vec<BTreeMap<IPFixField, FieldValue>>> {
199-
let template = match template {
200-
Some(t) => t,
201-
None => {
202-
// dbg!("Could not fetch any v10 templates!");
203-
return Err(NomErr::Error(NomError::new(i, ErrorKind::Fail)));
198+
fn parse_field<'a>(
199+
i: &'a [u8],
200+
template_field: &TemplateField,
201+
) -> IResult<&'a [u8], FieldValue> {
202+
// Enterprise Number
203+
if template_field.enterprise_number.is_some() {
204+
let (remaining, data_number) = DataNumber::parse(i, 4, false)?;
205+
Ok((remaining, FieldValue::DataNumber(data_number)))
206+
// Type matching
207+
} else {
208+
Ok(DataNumber::from_field_type(
209+
i,
210+
template_field.field_type.into(),
211+
template_field.field_length,
212+
))?
204213
}
205-
};
206-
let template_fields = template.get_fields();
207-
// If no fields there are no fields to parse
214+
}
215+
216+
// If no fields there are no fields to parse, return an error.
217+
let template_fields = template
218+
.ok_or(NomErr::Error(NomError::new(i, ErrorKind::Fail)))?
219+
.get_fields();
220+
208221
if template_fields.is_empty() {
209222
// dbg!("Template without fields!");
210223
return Err(NomErr::Error(NomError::new(i, ErrorKind::Fail)));
211224
};
225+
212226
let mut fields = vec![];
213227
let mut remaining = i;
228+
229+
// While we have bytes remaining
214230
while !remaining.is_empty() {
215231
let mut data_field = BTreeMap::new();
216232
for template_field in template_fields.iter() {
217-
let field_type: FieldDataType = template_field.field_type.into();
218-
// Enterprise Number
219-
if template_field.enterprise_number.is_some() {
220-
let (i, data_number) = DataNumber::parse(remaining, 4, false)?;
221-
remaining = i;
222-
data_field.insert(
223-
template_field.field_type,
224-
FieldValue::DataNumber(data_number),
225-
);
226-
continue;
227-
}
228-
// Type matching
229-
let (i, field_value) = DataNumber::from_field_type(
230-
remaining,
231-
field_type,
232-
template_field.field_length,
233-
)?;
233+
let (i, field_value) = parse_field(remaining, template_field)?;
234234
remaining = i;
235235
data_field.insert(template_field.field_type, field_value);
236236
}
237237
fields.push(data_field);
238238
}
239-
Ok((remaining, fields))
239+
Ok((&[], fields))
240240
}
241241

242242
impl NetflowByteParserVariable for IPFixParser {

0 commit comments

Comments
 (0)