static void pcap_pack_callback(unsigned char *args, const struct pcap_pkthdr *pkt_hdr, unsigned char *frame) { int l2_len; pcap_t *pcap; unsigned char *ip_data; if (pkt_hdr->len >= ETHERNET_HDR_LEN) { pcap = (pcap_t *) args; ip_data = get_ip_data(pcap, frame, pkt_hdr->len, &l2_len); resp_dispose((tc_iph_t *) ip_data); } else { tc_log_info(LOG_ERR, 0, "recv len is less than:%d", ETHERNET_HDR_LEN); } }
static void pcap_packet_callback(unsigned char *args, const struct pcap_pkthdr *pkt_hdr, unsigned char *packet) { pcap_t *pcap; unsigned char *ip_data; int l2_len; if (pkt_hdr->len < ETHERNET_HDR_LEN) { tc_log_info(LOG_ERR, 0, "recv len is less than:%d", ETHERNET_HDR_LEN); return; } pcap = (pcap_t *)args; ip_data = get_ip_data(pcap, packet, pkt_hdr->len, &l2_len); resp_dispose((tc_ip_header_t *) ip_data); }
static int tc_process_resp_packet(tc_event_t *rev) { #if (TCPCOPY_PCAP) pcap_t *pcap; #else int recv_len; char recv_buf[RESP_RECV_BUF_SIZE]; tc_ip_header_t *ip_header; #endif #if (TCPCOPY_PCAP) pcap = pcap_map[rev->fd]; pcap_dispatch(pcap, 1,(pcap_handler) pcap_packet_callback, (u_char *) pcap); #else recv_len = recvfrom(rev->fd, recv_buf, RESP_RECV_BUF_SIZE, 0, NULL, NULL); if (recv_len == -1) { if (errno == EAGAIN) { return TC_OK; } tc_log_info(LOG_ERR, errno, "recvfrom"); return TC_ERROR; } if (recv_len < 40) { tc_log_info(LOG_ERR, 0, "recv len is less than 40:%d", recv_len); return TC_ERROR; } ip_header = (tc_ip_header_t *) (char *) (recv_buf); resp_dispose(ip_header); #endif return TC_OK; }