static int packet_callback(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,
              struct nfq_data *nfa, void *data)
{
	QHandler *handler = (QHandler *) data;

	u_int32_t id = get_pkt_id(nfa);
	char *payload;
	int payload_len;
	payload_len = nfq_get_payload(nfa, &payload);

	// Determine addresses
	IpAddress srcaddr((struct in_addr *) (payload + 12));
	IpAddress dstaddr((struct in_addr *) (payload + 16));
	// std::cout << "Got packet ID " << id << 
	// 	" from " << srcaddr << " to " << dstaddr << std::endl;
	// Work out what proto it is...
	int proto = (int) (unsigned char) payload[9];
	FnvHash hash;
	hash.addData(payload + 12, 8); // src + dst addr
	if (proto == IPPROTO_TCP) {
		// unsigned short sport = ntohs( *(unsigned short *) (payload+20));
		// unsigned short dport = ntohs( *(unsigned short *) (payload+22));
		// std::cout << "TCP sport " << sport << " dport " << dport
		// 	<< std::endl;
		hash.addData(payload + 20, 4); // src + dst ports
	}
	int hashvalue = hash.get16rev();
	// std::cout << "Hash value=" << hashvalue << std::endl;
	u_int32_t verdict = NF_DROP;
	if ((hashvalue >= handler->lowerHashLimit) && (hashvalue < handler->upperHashLimit))
		verdict = NF_ACCEPT;
	std::cout << "Connection from " << srcaddr << " Hash value=" << hashvalue << " Accept: " << (verdict == NF_ACCEPT ? "yes" : "no") << std::endl;
	return nfq_set_verdict(handler->GetQh(), id, verdict, 0, NULL);
}
示例#2
0
void
wifiiq(Wifi *wifi, Block *b)
{
    SNAP s;
    Wifipkt h, *w;
    Etherpkt *e;
    int hdrlen;

    if(BLEN(b) < WIFIHDRSIZE)
        goto drop;
    w = (Wifipkt*)b->rp;
    hdrlen = wifihdrlen(w);
    if(BLEN(b) < hdrlen)
        goto drop;
    if(w->fc[1] & 0x40) {
        /* encrypted */
        qpass(wifi->iq, b);
        return;
    }
    switch(w->fc[0] & 0x0c) {
    case 0x00:	/* management */
        if((w->fc[1] & 3) != 0x00)	/* STA->STA */
            break;
        qpass(wifi->iq, b);
        return;
    case 0x04:	/* control */
        break;
    case 0x08:	/* data */
        b->rp += hdrlen;
        switch(w->fc[0] & 0xf0) {
        default:
            goto drop;
        case 0x80:	/* QOS */
        case 0x00:
            break;
        }
        if(BLEN(b) < SNAPHDRSIZE)
            break;
        memmove(&s, b->rp, SNAPHDRSIZE);
        if(s.dsap != 0xAA || s.ssap != 0xAA || s.control != 3)
            break;
        if(s.orgcode[0] != 0 || s.orgcode[1] != 0 || s.orgcode[2] != 0)
            break;
        b->rp += SNAPHDRSIZE-ETHERHDRSIZE;
        h = *w;
        e = (Etherpkt*)b->rp;
        memmove(e->d, dstaddr(&h), Eaddrlen);
        memmove(e->s, srcaddr(&h), Eaddrlen);
        memmove(e->type, s.type, 2);
        etheriq(wifi->ether, b, 1);
        return;
    }
drop:
    freeb(b);
}