blob: 2fa67f975a0b63af3c1db59d87546d0d670f02fe [file] [log] [blame]
#ifndef __OFFLOAD_REQ__
#define __OFFLOAD_REQ__
#include <stdint.h>
/*
* Header at the beginning of an offload policy file.
*/
struct ClassifierFileHeader {
unsigned int vers; // version of file format
int output_everything; // value of Classifier::_output_everything
unsigned int nrules; // value of noutputs()
unsigned int prog_size; // Classifier::_exprs.size()
unsigned int opt_prog_size; // IPFilter::_prog.size()
unsigned int nsettings; // IPFilter::_settings.size()
};
/*
* Structure holding the values that will be matched against the criteria of
* offload policy rules.
*/
struct OffloadReq {
uint32_t sip[4];
uint32_t dip[4];
uint16_t sport;
uint16_t dport;
uint8_t ipvers_opentype; /* bits 0-3: IP version, bits 4-7: open type */
uint8_t tos;
uint16_t vlan;
uint32_t mark;
};
/*
* <FIELD>_WORD is the starting 32-bit word within OffloadReq of <FIELD>
* <FIELD>_OFFSET is the starting offset within <FIELD>_WORD of <FIELD>
*/
enum {
SIP_WORD = 0, SIP_OFFSET = 0,
DIP_WORD = 4, DIP_OFFSET = 0,
SPORT_WORD = 8, SPORT_OFFSET = 16,
DPORT_WORD = 8, DPORT_OFFSET = 0,
OPENTYPE_WORD = 9, OPENTYPE_OFFSET = 28,
VERS_WORD = 9, VERS_OFFSET = 24,
TOS_WORD = 9, TOS_OFFSET = 16,
VLAN_WORD = 9, VLAN_OFFSET = 0,
MARK_WORD = 10, MARK_OFFSET = 0,
};
/*
* Structure holding the offload settings specified by an offload policy rule.
*/
struct OffloadSettings {
uint8_t offload;
int8_t ddp;
int8_t rx_coalesce;
int8_t cong_algo;
int32_t bind_q;
int16_t sched_class;
int8_t tstamp;
int8_t sack;
#ifdef __cplusplus
OffloadSettings()
: offload(0), ddp(-1), rx_coalesce(-1), cong_algo(-1), bind_q(-1),
sched_class(-1), tstamp(-1), sack(-1)
{}
#endif
};
/*
* Special values for OffloadSettings.bind_q
*/
enum {
QUEUE_RANDOM = -2, /* bind to a random queue */
QUEUE_CPU = -3, /* bind to a queue detemined by CPU id */
};
static inline uint8_t mk_ipvers_opentype(uint8_t ipvers, uint8_t open_type)
{
return (open_type << 4) | ipvers;
}
#endif