blob: b1831e13fa826ef7cff8f2f2e282a4d1179517bb [file] [log] [blame]
/*
* Copyright (C) 2010 Semihalf.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _IPT_NFP_H
#define _IPT_NFP_H
#define IPT_NFP_F_SET_DSCP 0x1
#define IPT_NFP_F_SET_DSCP_DEF 0x2
#define IPT_NFP_F_SET_VLAN_PRIO 0x4
#define IPT_NFP_F_SET_VLAN_PRIO_DEF 0x8
#define IPT_NFP_F_SET_TXQ 0x10
#define IPT_NFP_F_SET_TXP 0x20
#define IPT_NFP_F_SET_MH 0x40
#define IPT_NFP_F_SET_LIMIT 0x80
#define IPT_NFP_F_SET_BURST 0x100
#define IPT_NFP_F_SET_TXQ_DEF 0x200
enum ipt_nfp_mode {
IPT_NFP_INIT = -1,
IPT_NFP_FWD = 0,
IPT_NFP_DROP = 1,
IPT_NFP_MANGLE = 2,
};
/* 0..7 + one cell for global mapping regardless of the old VLAN Prio value (the '-1' option) */
#define IPT_NFP_VPRI_MAP_SIZE 9
#define IPT_NFP_VPRI_MAP_GLOBAL 8 /* index in the array for the global mapping */
typedef struct {
unsigned char new_prio;
unsigned char valid;
} IPT_NFP_VPRI_MAP_INFO;
/* 0..63 + one cell for global mapping regardless of the old DSCP value (the '-1' option) */
#define IPT_NFP_DSCP_MAP_SIZE 65
#define IPT_NFP_DSCP_MAP_GLOBAL 64 /* index in the array for the global mapping */
typedef struct {
unsigned char new_dscp;
unsigned char valid;
} IPT_NFP_DSCP_MAP_INFO;
typedef struct {
unsigned char txq;
unsigned char valid;
} IPT_NFP_TXQ_MAP_INFO;
struct ipt_nfp_info {
unsigned int mode;
unsigned int flags;
int burst;
int limit;
int dscp;
int new_dscp;
IPT_NFP_DSCP_MAP_INFO dscp_map[IPT_NFP_DSCP_MAP_SIZE];
int vlanprio;
int new_vlanprio;
IPT_NFP_VPRI_MAP_INFO vpri_map[IPT_NFP_VPRI_MAP_SIZE];
int dscp_txq; /* map DSCP to TXQ */
int txq;
IPT_NFP_TXQ_MAP_INFO txq_map[IPT_NFP_DSCP_MAP_SIZE];
int txp;
int mh;
/* private */
struct ipt_entry *entry;
};
static inline void nfp_update_tuple_info(struct ipt_nfp_info *dst, struct ipt_nfp_info *src)
{
/* we copy (override) some of the parameters, but update (accumulate) others */
dst->mode = src->mode;
dst->flags |= src->flags;
if (src->flags & IPT_NFP_F_SET_BURST)
dst->burst = src->burst;
if (src->flags & IPT_NFP_F_SET_LIMIT)
dst->limit = src->limit;
if (src->flags & IPT_NFP_F_SET_DSCP) {
dst->dscp_map[src->dscp].new_dscp = src->new_dscp;
dst->dscp_map[src->dscp].valid = 1;
}
if (src->flags & IPT_NFP_F_SET_DSCP_DEF) {
dst->dscp_map[IPT_NFP_DSCP_MAP_GLOBAL].new_dscp = src->new_dscp;
dst->dscp_map[IPT_NFP_DSCP_MAP_GLOBAL].valid = 1;
}
if (src->flags & IPT_NFP_F_SET_VLAN_PRIO) {
dst->vpri_map[src->vlanprio].new_prio = src->new_vlanprio;
dst->vpri_map[src->vlanprio].valid = 1;
}
if (src->flags & IPT_NFP_F_SET_VLAN_PRIO_DEF) {
dst->vpri_map[IPT_NFP_VPRI_MAP_GLOBAL].new_prio = src->new_vlanprio;
dst->vpri_map[IPT_NFP_VPRI_MAP_GLOBAL].valid = 1;
}
if (src->flags & IPT_NFP_F_SET_TXQ) {
dst->txq_map[src->dscp_txq].txq = src->txq;
dst->txq_map[src->dscp_txq].valid = 1;
}
if (src->flags & IPT_NFP_F_SET_TXQ_DEF) {
dst->txq_map[IPT_NFP_DSCP_MAP_GLOBAL].txq = src->txq;
dst->txq_map[IPT_NFP_DSCP_MAP_GLOBAL].valid = 1;
}
if (src->flags & IPT_NFP_F_SET_TXP)
dst->txp = src->txp;
if (src->flags & IPT_NFP_F_SET_MH)
dst->mh = src->mh;
dst->entry = src->entry;
}
#endif