/*
 *
 * (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;
}

