コード例 #1
1
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
ファイル: wifi.c プロジェクト: grobe0ba/plan9front
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);
}
コード例 #3
0
ファイル: clntkel.cpp プロジェクト: EISALab/AMGAgroundwater
void CClientManager::ShutdownServer( IN_ADDR addrHost, bool bForward )
{
	CSocket sock;
	sock.Socket( SOCK_DGRAM );

	if( addrHost.s_addr==INADDR_ANY ){
		//send shutdown message to all the known host addresses
		CObjLocker<CClientManager> locker(this);
		set<IN_ADDR>::iterator pos;
		for( pos=m_HostAddrs.begin(); pos!=m_HostAddrs.end(); ++pos ){
			CMessageBase msg;
			msg.Init( NCM_SHUTDOWN, CSessionAddr(GetLocalInAddr(), 0), CSessionAddr(*pos, 0), bForward );
			CSockAddrIn dstaddr( *pos, NCP_SERVER_PING_PORT );
			SendMessageTo( sock, &msg, dstaddr );
		}
	}else{
		//send shutdown to a specific addresse
		CMessageBase msg;
		msg.Init( NCM_SHUTDOWN, CSessionAddr(GetLocalInAddr(), 0), CSessionAddr(addrHost, 0), bForward );
		CSockAddrIn dstaddr( addrHost, NCP_SERVER_PING_PORT );
		SendMessageTo( sock, &msg, dstaddr );
	}
}
コード例 #4
0
/** @see AmThread */
void udp_trsp::run()
{
    char buf[MAX_UDP_MSGLEN];
    int buf_len;

    msghdr           msg;
    //control_data     cmsg;
    cmsghdr*         cmsgptr; 
    sockaddr_storage from_addr;
    iovec            iov[1];

    iov[0].iov_base = buf;
    iov[0].iov_len  = MAX_UDP_MSGLEN;

    memset(&msg,0,sizeof(msg));
    msg.msg_name       = &from_addr;
    msg.msg_namelen    = sizeof(sockaddr_storage);
    msg.msg_iov        = iov;
    msg.msg_iovlen     = 1;
    msg.msg_control    = new u_char[DSTADDR_DATASIZE];
    msg.msg_controllen = DSTADDR_DATASIZE;

    if(sd<=0){
	ERROR("Transport instance not bound\n");
	return;
    }

    while(true){

	DBG("before recvmsg (%s:%i)\n",local_ip.c_str(),local_port);

	buf_len = recvmsg(sd,&msg,0);
	if(buf_len <= 0){
	    ERROR("recvfrom returned %d: %s\n",buf_len,strerror(errno));
	    switch(errno){
	    case EBADF:
	    case ENOTSOCK:
	    case EOPNOTSUPP:
		return;
	    }
	    continue;
	}

	if(buf_len > MAX_UDP_MSGLEN){
	    ERROR("Message was too big (>%d)\n",MAX_UDP_MSGLEN);
	    continue;
	}
	sip_msg* s_msg = new sip_msg(buf,buf_len);

	if (SipCtrlInterfaceFactory::log_raw_messages >= 0) {
	    _LOG(SipCtrlInterfaceFactory::log_raw_messages, 
		 "recvd msg\n--++--\n%s--++--\n", s_msg->buf);
	}
	memcpy(&s_msg->remote_ip,msg.msg_name,msg.msg_namelen);
	//msg->remote_ip_len = sizeof(sockaddr_storage);

	for (cmsgptr = CMSG_FIRSTHDR(&msg);
             cmsgptr != NULL;
             cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) {
	    
            if (cmsgptr->cmsg_level == IPPROTO_IP &&
                cmsgptr->cmsg_type == DSTADDR_SOCKOPT) {
		
		s_msg->local_ip.ss_family = AF_INET;
		((sockaddr_in*)(&s_msg->local_ip))->sin_port   = htons(local_port);
                memcpy(&((sockaddr_in*)(&s_msg->local_ip))->sin_addr,dstaddr(cmsgptr),sizeof(in_addr));
            }
        } 

	// pass message to the parser / transaction layer
	tl->received_msg(s_msg);
    }
}