blob: c6132b95924a7a594a508b7dbd878e7258c386f4 [file] [log] [blame]
/*
*
* (C) 2012-13 - ntop.org
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lessed General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
*
*/
#include "pfring.h"
#ifdef HAVE_REDIRECTOR
#include "pfring_redirector.c"
#endif
/* ********************************* */
static int virtual_filtering_device_add_hw_rule(pfring *ring, hw_filtering_rule *rule) {
return setsockopt(ring->fd, 0, SO_ADD_HW_FILTERING_RULE, rule, sizeof(hw_filtering_rule));
}
static int virtual_filtering_device_remove_hw_rule(pfring *ring, u_int16_t rule_id) {
return setsockopt(ring->fd, 0, SO_DEL_HW_FILTERING_RULE, &rule_id, sizeof(rule_id));
}
/* ********************************* */
#include "pfring_i82599.c"
/* ********************************* */
void pfring_hw_ft_init(pfring *ring) {
int rc;
socklen_t len = sizeof(pfring_device_type);
rc = getsockopt(ring->fd, 0, SO_GET_DEVICE_TYPE, &ring->ft_device_type, &len);
if(rc < 0)
ring->ft_device_type = standard_nic_family;
#ifdef HAVE_REDIRECTOR
init_redirector(ring);
#endif
}
/* ********************************* */
int pfring_hw_ft_set_traffic_policy(pfring *ring, u_int8_t rules_default_accept_policy) {
int rc = 0;
#ifdef HAVE_REDIRECTOR
if(ring->rdi.port_id != -1)
rc = redirector_set_traffic_policy(ring, rules_default_accept_policy);
#endif
return rc;
}
/* ********************************* */
int pfring_hw_ft_add_hw_rule(pfring *ring, hw_filtering_rule *rule) {
int rc;
if(!rule)
return -2;
switch (ring->ft_device_type) {
case intel_82599_family:
rc = virtual_filtering_device_add_hw_rule(ring, rule);
break;
case standard_nic_family:
default:
rc = 0;
break;
}
if(rc < 0)
return rc;
#ifdef HAVE_REDIRECTOR
if(ring && (ring->rdi.port_id != -1))
rc = redirector_add_hw_rule(ring, rule, NULL, NULL);
#endif
return rc;
}
/* ********************************* */
int pfring_hw_ft_remove_hw_rule(pfring *ring, u_int16_t rule_id) {
int rc;
switch (ring->ft_device_type) {
case intel_82599_family:
rc = virtual_filtering_device_remove_hw_rule(ring, rule_id);
break;
case standard_nic_family:
default:
rc = 0;
break;
}
if(rc < 0)
return rc;
#ifdef HAVE_REDIRECTOR
if(ring && (ring->rdi.port_id != -1))
rc = redirector_remove_hw_rule(ring, rule_id);
#endif
return rc;
}
/* ********************************* */
int pfring_hw_ft_handle_hash_filtering_rule(pfring *ring, hash_filtering_rule* rule_to_add, u_char add_rule) {
int rc;
if(!rule_to_add)
return -2;
if(rule_to_add->plugin_action.plugin_id != NO_PLUGIN_ID)
return 0;
switch (ring->ft_device_type) {
case intel_82599_family:
if(add_rule)
rc = i82599_add_hash_filtering_rule(ring, rule_to_add);
else
rc = i82599_remove_filtering_rule(ring, rule_to_add->rule_id);
break;
case standard_nic_family:
default:
rc = 0;
break;
}
if(rc < 0)
return rc;
#ifdef HAVE_REDIRECTOR
if(ring->rdi.port_id != -1) {
if(add_rule)
rc = redirector_add_hash_filtering_rule(ring, rule_to_add);
else
rc = redirector_remove_filtering_rule(ring, rule_to_add->rule_id);
}
#endif
return rc;
}
/* ********************************* */
int pfring_hw_ft_add_filtering_rule(pfring *ring, filtering_rule* rule_to_add) {
int rc;
if(!rule_to_add)
return -2;
if(rule_to_add->plugin_action.plugin_id != NO_PLUGIN_ID)
return 0;
switch (ring->ft_device_type) {
case intel_82599_family:
rc = i82599_add_filtering_rule(ring, rule_to_add);
break;
case standard_nic_family:
default:
rc = 0;
break;
}
if(rc < 0)
return rc;
#ifdef HAVE_REDIRECTOR
if(ring->rdi.port_id != -1)
rc = redirector_add_filtering_rule(ring, rule_to_add);
#endif
return rc;
}
/* ********************************* */
int pfring_hw_ft_remove_filtering_rule(pfring *ring, u_int16_t rule_id) {
int rc;
switch (ring->ft_device_type) {
case intel_82599_family:
rc = i82599_remove_filtering_rule(ring, rule_id);
break;
case standard_nic_family:
default:
rc = 0;
break;
}
if(rc < 0)
return rc;
#ifdef HAVE_REDIRECTOR
if(ring->rdi.port_id != -1)
rc = redirector_remove_filtering_rule(ring, rule_id);
#endif
return rc;
}