af-packet: add support for checksum verif mode

This patch adds support for checksum verification mode.
Auto mode is not yet supported.
remotes/origin/master-1.2.x
Eric Leblond 15 years ago committed by Victor Julien
parent 551cb3e4c2
commit 6062e00c2b

@ -125,7 +125,7 @@ void *ParseAFPConfig(const char *iface)
aconf->cluster_id = 1; aconf->cluster_id = 1;
aconf->cluster_type = PACKET_FANOUT_HASH; aconf->cluster_type = PACKET_FANOUT_HASH;
aconf->promisc = 1; aconf->promisc = 1;
aconf->detect_offload = 1; aconf->checksum_mode = CHECKSUM_VALIDATION_KERNEL;
aconf->DerefFunc = AFPDerefConfig; aconf->DerefFunc = AFPDerefConfig;
/* Find initial node */ /* Find initial node */
@ -204,14 +204,25 @@ void *ParseAFPConfig(const char *iface)
aconf->iface); aconf->iface);
aconf->promisc = 0; aconf->promisc = 0;
} }
ConfGetChildValueBool(if_root, "detect-offload", (int *)&boolval);
if (! boolval) {
SCLogInfo("Disabling checksum offloading detection for %s",
aconf->iface);
aconf->detect_offload = 0;
}
if (ConfGetChildValue(if_root, "checksum-checks", &tmpctype) != 1) {
SCLogError(SC_ERR_INVALID_ARGUMENT, "Could not get checksum-checks from config");
} else {
if (strcmp(tmpctype, "auto") == 0) {
SCLogError(SC_ERR_INVALID_ARGUMENT,"'auto' mode is currently not supported");
/*
aconf->checksum_mode = CHECKSUM_VALIDATION_AUTO;
*/
} else if (strcmp(tmpctype, "yes") == 0) {
aconf->checksum_mode = CHECKSUM_VALIDATION_ENABLE;
} else if (strcmp(tmpctype, "no") == 0) {
aconf->checksum_mode = CHECKSUM_VALIDATION_DISABLE;
} else if (strcmp(tmpctype, "kernel") == 0) {
aconf->checksum_mode = CHECKSUM_VALIDATION_KERNEL;
} else {
SCLogError(SC_ERR_INVALID_ARGUMENT, "Invalid value for checksum-checks for %s", aconf->iface);
}
}
return aconf; return aconf;
} }

@ -160,14 +160,13 @@ typedef struct AFPThreadVars_
/* socket buffer size */ /* socket buffer size */
int buffer_size; int buffer_size;
int promisc; int promisc;
int detect_offload; ChecksumValidationMode checksum_mode;
int cluster_id; int cluster_id;
int cluster_type; int cluster_type;
int threads; int threads;
} AFPThreadVars; } AFPThreadVars;
TmEcode ReceiveAFP(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *); TmEcode ReceiveAFP(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *);
@ -290,21 +289,29 @@ int AFPRead(AFPThreadVars *ptv)
SCLogDebug("pktlen: %" PRIu32 " (pkt %p, pkt data %p)", SCLogDebug("pktlen: %" PRIu32 " (pkt %p, pkt data %p)",
GET_PKT_LEN(p), p, GET_PKT_DATA(p)); GET_PKT_LEN(p), p, GET_PKT_DATA(p));
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { /* We only check for checksum disable */
struct tpacket_auxdata *aux; if (ptv->checksum_mode == CHECKSUM_VALIDATION_DISABLE) {
p->flags |= PKT_IGNORE_CHECKSUM;
if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct tpacket_auxdata)) || } else {
cmsg->cmsg_level != SOL_PACKET || /* List is NULL if we don't have activated auxiliary data */
cmsg->cmsg_type != PACKET_AUXDATA) for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
continue; struct tpacket_auxdata *aux;
if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct tpacket_auxdata)) ||
cmsg->cmsg_level != SOL_PACKET ||
cmsg->cmsg_type != PACKET_AUXDATA)
continue;
aux = (struct tpacket_auxdata *)CMSG_DATA(cmsg); aux = (struct tpacket_auxdata *)CMSG_DATA(cmsg);
if (aux->tp_status & TP_STATUS_CSUMNOTREADY) { if (aux->tp_status & TP_STATUS_CSUMNOTREADY) {
p->flags |= PKT_IGNORE_CHECKSUM; p->flags |= PKT_IGNORE_CHECKSUM;
}
break;
} }
} }
if (TmThreadsSlotProcessPkt(ptv->tv, ptv->slot, p) != TM_ECODE_OK) { if (TmThreadsSlotProcessPkt(ptv->tv, ptv->slot, p) != TM_ECODE_OK) {
TmqhOutputPacketpool(ptv->tv, p); TmqhOutputPacketpool(ptv->tv, p);
SCReturnInt(AFP_FAILURE); SCReturnInt(AFP_FAILURE);
@ -523,7 +530,7 @@ static int AFPCreateSocket(AFPThreadVars *ptv, char *devname, int verbose)
} }
} }
if (ptv->detect_offload) { if (ptv->checksum_mode == CHECKSUM_VALIDATION_KERNEL) {
int val = 1; int val = 1;
if (setsockopt(ptv->socket, SOL_PACKET, PACKET_AUXDATA, &val, if (setsockopt(ptv->socket, SOL_PACKET, PACKET_AUXDATA, &val,
sizeof(val)) == -1 && errno != ENOPROTOOPT) { sizeof(val)) == -1 && errno != ENOPROTOOPT) {
@ -613,7 +620,7 @@ TmEcode ReceiveAFPThreadInit(ThreadVars *tv, void *initdata, void **data) {
ptv->buffer_size = afpconfig->buffer_size; ptv->buffer_size = afpconfig->buffer_size;
ptv->promisc = afpconfig->promisc; ptv->promisc = afpconfig->promisc;
ptv->detect_offload = afpconfig->detect_offload; ptv->checksum_mode = afpconfig->checksum_mode;
ptv->threads = 1; ptv->threads = 1;
#ifdef HAVE_PACKET_FANOUT #ifdef HAVE_PACKET_FANOUT

@ -53,8 +53,7 @@ typedef struct AFPIfaceConfig_
int cluster_type; int cluster_type;
/* promisc mode */ /* promisc mode */
int promisc; int promisc;
/* no local packet */ ChecksumValidationMode checksum_mode;
int detect_offload;
SC_ATOMIC_DECLARE(unsigned int, ref); SC_ATOMIC_DECLARE(unsigned int, ref);
void (*DerefFunc)(void *); void (*DerefFunc)(void *);
} AFPIfaceConfig; } AFPIfaceConfig;

Loading…
Cancel
Save