Skip to content
This repository has been archived by the owner on Apr 7, 2020. It is now read-only.

Commit

Permalink
Hopefully, support for inet constants
Browse files Browse the repository at this point in the history
  • Loading branch information
istoffa committed Aug 24, 2017
1 parent 0bb4976 commit e22650f
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 49 deletions.
2 changes: 1 addition & 1 deletion src/fields.c
Expand Up @@ -2043,7 +2043,7 @@ lnf_field_def_t lnf_fields_def[] = {
{LNF_FLD_ZERO_, LNF_FLD_ZERO_, LNF_FLD_ZERO_, LNF_FLD_ZERO_},
{LNF_FLD_ZERO_, LNF_FLD_ZERO_},
"inetfamily", "IENT family for src/dst IP address (ipv4 or ipv6); platform dependant",
NULL, 0, 0,
"ipVersion", 0, 60,
NULL, 0, 0,
lnf_field_fget_INET_FAMILY,
lnf_field_fset_INET_FAMILY},
Expand Down
115 changes: 67 additions & 48 deletions src/lnf_filter.c
Expand Up @@ -50,57 +50,76 @@

pthread_mutex_t lnf_nfdump_filter_match_mutex; /* mutex for operations match filter */

static char lnfc_inet[4];
static char lnfc_inet6[4];

/* callback from ffilter to lookup field */
ff_error_t lnf_ff_lookup_func(ff_t *filter, const char *fieldstr, ff_lvalue_t *lvalue) {

/* fieldstr is set - trie to find field id and relevant _fget function */
if ( fieldstr != NULL ) {

int x = lvalue->id[0].index = lnf_fld_parse(fieldstr, NULL, NULL);

if (lvalue->id[0].index == LNF_FLD_ZERO_) {
return FF_ERR_UNKN;
}

if (x == LNF_FLD_TCP_FLAGS) {
lvalue->options = FF_OPTS_FLAGS;
}

if (lnf_fields_def[x].pair_field[0] != LNF_FLD_ZERO_) {
lvalue->id[0].index = lnf_fields_def[x].pair_field[0];
lvalue->id[1].index = lnf_fields_def[x].pair_field[1];
}

switch (lnf_fld_type(lvalue->id[0].index)) {
case LNF_UINT8:
lvalue->type = FF_TYPE_UINT8;
break;
case LNF_UINT16:
lvalue->type = FF_TYPE_UINT16;
break;
case LNF_UINT32:
lvalue->type = FF_TYPE_UINT32;
break;
case LNF_UINT64:
lvalue->type = FF_TYPE_UINT64;
break;
case LNF_DOUBLE:
lvalue->type = FF_TYPE_DOUBLE;
break;
case LNF_ADDR:
lvalue->type = FF_TYPE_ADDR;
break;
case LNF_MAC:
lvalue->type = FF_TYPE_MAC;
break;
case LNF_MPLS:
lvalue->type = FF_TYPE_MPLS; break;
default:
return FF_ERR_UNSUP;
}

return FF_OK;
}

/* fieldstr is set - try to find field id and relevant _fget function */
if ( fieldstr != NULL ) {

// Quick support for those few compatibility constants needed
if (!strcmp(fieldstr, "inet") || !strcmp(fieldstr, "ipv4")) {
snprintf(lnfc_inet, 4, "%d", AF_INET);
lvalue->literal = &lnfc_inet[0];
lvalue->options = FF_OPTS_CONST;
fieldstr = "inetfamily";

} else if (!strcmp(fieldstr, "inet6") || !strcmp(fieldstr, "ipv6")) {
snprintf(lnfc_inet6, 4, "%d", AF_INET6);
lvalue->literal = &lnfc_inet6[0];
lvalue->options = FF_OPTS_CONST;
fieldstr = "inetfamily";
}

int x = lvalue->id[0].index = lnf_fld_parse(fieldstr, NULL, NULL);

if (lvalue->id[0].index == LNF_FLD_ZERO_) {
return FF_ERR_UNKN;
}

if (x == LNF_FLD_TCP_FLAGS) {
lvalue->options = FF_OPTS_FLAGS;
}

if (lnf_fields_def[x].pair_field[0] != LNF_FLD_ZERO_) {
lvalue->id[0].index = lnf_fields_def[x].pair_field[0];
lvalue->id[1].index = lnf_fields_def[x].pair_field[1];
}

switch (lnf_fld_type(lvalue->id[0].index)) {
case LNF_UINT8:
lvalue->type = FF_TYPE_UINT8;
break;
case LNF_UINT16:
lvalue->type = FF_TYPE_UINT16;
break;
case LNF_UINT32:
lvalue->type = FF_TYPE_UINT32;
break;
case LNF_UINT64:
lvalue->type = FF_TYPE_UINT64;
break;
case LNF_DOUBLE:
lvalue->type = FF_TYPE_DOUBLE;
break;
case LNF_ADDR:
lvalue->type = FF_TYPE_ADDR;
break;
case LNF_MAC:
lvalue->type = FF_TYPE_MAC;
break;
case LNF_MPLS:
lvalue->type = FF_TYPE_MPLS;
break;
default:
return FF_ERR_UNSUP;
}

return FF_OK;
}

return FF_ERR_OTHER;
}
Expand Down

0 comments on commit e22650f

Please sign in to comment.