/** * \internal * \brief This function is used to match packets with a IPs in an specified country * * \param t pointer to thread vars * \param det_ctx pointer to the pattern matcher thread * \param p pointer to the current packet * \param m pointer to the sigmatch that we will cast into DetectGeoipData * * \retval 0 no match * \retval 1 match */ static int DetectGeoipMatch(ThreadVars *t, DetectEngineThreadCtx *det_ctx, Packet *p, Signature *s, SigMatch *m) { DetectGeoipData *geoipdata = (DetectGeoipData *)m->ctx; int matches = 0; if (PKT_IS_PSEUDOPKT(p)) return 0; if (PKT_IS_IPV4(p)) { if (geoipdata->flags & ( GEOIP_MATCH_SRC_FLAG | GEOIP_MATCH_BOTH_FLAG )) { if (CheckGeoMatchIPv4(geoipdata, GET_IPV4_SRC_ADDR_U32(p))) { if (geoipdata->flags & GEOIP_MATCH_BOTH_FLAG) matches++; else return 1; } } if (geoipdata->flags & ( GEOIP_MATCH_DST_FLAG | GEOIP_MATCH_BOTH_FLAG )) { if (CheckGeoMatchIPv4(geoipdata, GET_IPV4_DST_ADDR_U32(p))) { if (geoipdata->flags & GEOIP_MATCH_BOTH_FLAG) matches++; else return 1; } } /* if matches == 2 is because match-on is "both" */ if (matches == 2) return 1; } return 0; }
TmEcode AlertUnifiedAlert (ThreadVars *tv, Packet *p, void *data, PacketQueue *pq, PacketQueue *postpq) { AlertUnifiedAlertThread *aun = (AlertUnifiedAlertThread *)data; AlertUnifiedAlertPacketHeader hdr; int ret; uint8_t ethh_offset = 0; /* the unified1 format only supports IPv4. */ if (p->alerts.cnt == 0 || !PKT_IS_IPV4(p)) return TM_ECODE_OK; /* if we have no ethernet header (e.g. when using nfq), we have to create * one ourselves. */ if (p->ethh == NULL) { ethh_offset = sizeof(EthernetHdr); } /* fill the hdr structure with the data of the packet */ hdr.pad1 = 0; hdr.pad2 = 0; hdr.ts.tv_sec = hdr.ref_ts.tv_sec = p->ts.tv_sec; hdr.ts.tv_usec = hdr.ref_ts.tv_usec = p->ts.tv_sec; hdr.src_ip = ntohl(GET_IPV4_SRC_ADDR_U32(p)); /* addr is host order */ hdr.dst_ip = ntohl(GET_IPV4_DST_ADDR_U32(p)); /* addr is host order */ hdr.sp = p->sp; hdr.dp = p->dp; hdr.protocol = IPV4_GET_RAW_IPPROTO(p->ip4h); hdr.flags = 0; uint16_t i = 0; for (; i < p->alerts.cnt; i++) { PacketAlert *pa = &p->alerts.alerts[i]; /* fill the rest of the hdr structure with the data of the alert */ hdr.sig_gen = pa->gid; hdr.sig_sid = pa->sid; hdr.sig_rev = pa->rev; hdr.sig_class = pa->class; hdr.sig_prio = pa->prio; SCMutexLock(&aun->file_ctx->fp_mutex); /** check and enforce the filesize limit, thread safe */ if ((aun->file_ctx->size_current + sizeof(hdr)) > aun->file_ctx->size_limit) { if (AlertUnifiedAlertRotateFile(tv,aun) < 0) { SCMutexUnlock(&aun->file_ctx->fp_mutex); aun->file_ctx->alerts += i; return TM_ECODE_FAILED; } } /* Then the unified header */ ret = fwrite(&hdr, sizeof(AlertUnifiedAlertPacketHeader), 1, aun->file_ctx->fp); if (ret != 1) { SCLogError(SC_ERR_FWRITE, "Error: fwrite failed: %s", strerror(errno)); SCMutexUnlock(&aun->file_ctx->fp_mutex); aun->file_ctx->alerts += i; return TM_ECODE_FAILED; } /* force writing to disk so barnyard will not read half * written records and choke. */ fflush(aun->file_ctx->fp); aun->file_ctx->size_current += sizeof(hdr); aun->file_ctx->alerts++; SCMutexUnlock(&aun->file_ctx->fp_mutex); } return TM_ECODE_OK; }