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); }
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); }
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 ); } }
/** @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); } }