int main(void) { int sfd; struct sockaddr_in saddr; char packet[50]; struct iphdr *ip = (struct iphdr *)packet; if ((sfd = socket(AF_INET, SOCK_RAW, 55)) < 0) { perror("error:"); exit(EXIT_FAILURE); } memset(packet, 0, sizeof(packet)); int fromlen = sizeof(saddr); while(1) { recvfrom(sfd, packet, sizeof(packet), 0,(struct sockaddr *)&saddr, &fromlen); char * data=packet+sizeof(struct iphdr); while((*data)!='\0' && (*data)!='\n'){ printf("%c", *data); data++; } printf("\n"); print_iphdr((struct iphdr *)packet); } }
static int VnetPeer_forward(VnetPeer *peer, struct sk_buff *fwdskb){ int err = 0; const int ip_n = sizeof(struct iphdr); const int udp_n = sizeof(struct udphdr); const int vnet_n = sizeof(struct VnetMsgHdr); int head_n = 16 + ip_n + udp_n + vnet_n; int push_n = 0; struct sk_buff *skb = NULL; struct VnetMsgHdr *vhdr; uint32_t saddr = 0; uint16_t sport = varp_port; uint32_t daddr = peer->addr.u.ip4.s_addr; uint16_t dport = varp_port; if(!fwdskb) goto exit; if(daddr == fwdskb->nh.iph->saddr){ // Don't forward if the skb src addr is the peer addr. dprintf("> Forward loop on " IPFMT "\n", NIPQUAD(daddr)); goto exit; } // On entry fwdskb->data should be at fwdskb->nh.raw (adjust if not). // Also fwdskb->h.raw and fwdskb->nh.raw are set. if(fwdskb->data > fwdskb->nh.raw){ push_n = fwdskb->data - fwdskb->nh.raw; head_n += push_n; } // If has headroom, copies header (which incs ref on dst), // otherwise only clones header, which does not inc ref on dst. skb = skb_realloc_headroom(fwdskb, head_n); //skb = skb_copy_expand(fwdskb, head_n, 0, GFP_ATOMIC); if(!skb){ err = -ENOMEM; goto exit; } if(push_n){ skb_push(skb, push_n); } #ifdef DEBUG printk("\nOriginal packet:\n"); print_iphdr(__FUNCTION__, skb); skb_print_bits(__FUNCTION__, skb, 0, skb->len); #endif skb->mac.raw = NULL; vhdr = (void*)skb_push(skb, vnet_n); vhdr->id = htons(VFWD_ID); vhdr->opcode = 0; // Setup the UDP header. skb->h.raw = skb_push(skb, udp_n); skb->h.uh->source = sport; // Source port. skb->h.uh->dest = dport; // Destination port. skb->h.uh->len = htons(skb->len); // Total packet length (bytes). skb->h.uh->check = 0; // Setup the IP header. skb->nh.raw = skb_push(skb, ip_n); skb->nh.iph->version = 4; // Standard version. skb->nh.iph->ihl = ip_n / 4; // IP header length (32-bit words). skb->nh.iph->tos = 0; // No special type-of-service. skb->nh.iph->tot_len = htons(skb->len); // Total packet length (bytes). skb->nh.iph->id = 0; // No flow id. skb->nh.iph->protocol = IPPROTO_UDP; // IP protocol number. skb->nh.iph->frag_off = 0; skb->nh.iph->ttl = 64; // Linux default time-to-live. skb->nh.iph->saddr = saddr; // Source address. skb->nh.iph->daddr = daddr; // Destination address. skb->nh.iph->check = 0; #ifdef DEBUG printk("\nWrapped packet:\n"); print_iphdr(__FUNCTION__, skb); print_udphdr(__FUNCTION__, skb); skb_print_bits(__FUNCTION__, skb, 0, skb->len); #endif err = _skb_xmit(skb, saddr); peer->tx_packets++; exit: if(err < 0) kfree_skb(skb); return err; }
int main(void) { int sfd, len; struct sockaddr_ll sl; struct ethernet_header *pethdr; struct ip_header *piphdr = 0; struct tcp_header *ptcphdr = 0; char buf[MTU]; sfd = socket(AF_PACKET, SOCK_RAW, htons(ETHERTYPE_IP)); if(-1 == sfd) { die("socket"); } memset(&sl, 0, sizeof(sl)); sl.sll_family = AF_PACKET; //sl.sll_protocol = htons(ETH_P_ALL); //sl.sll_ifindex = IFF_BROADCAST; if(-1 == bind(sfd, (sockaddr*)&sl, sizeof(sl))) { die("bind"); } while(1) { len = recv(sfd, buf, MTU, 0); if(!len) { perror("recv"); continue; } //获得ethernet_header的指针 ethernet_header *pethdr = (ethernet_header *)&buf; print_ethdr(&pethdr); //获得ip_header的指针 piphdr = (ip_header*) ( (char*)pethdr + sizeof(ethernet_header) ); print_iphdr(&piphdr); //检测是否为IP协议 if(0x6 != piphdr->protocal) continue; //获得tcp_header的指针 int optlen = piphdr->header_len > 5 ? 4 : 0; ptcphdr = (tcp_header*) ( (char*)piphdr + sizeof(ip_header) + optlen); print_tcphdr(&ptcphdr); //获取数据区指针 //数据区长度 int datalen = ntohs(piphdr->total_len) - piphdr->header_len * 4 - ptcphdr->dataoffset * 4; char *pbuf = new char[datalen]; //数据区首字节指针 char *pdata = (char*) ( (char*)ptcphdr + ptcphdr->dataoffset * 4); memcpy(pbuf, pdata, datalen); printf("---------------------------data begin----------------------------\n"); printf("data = %s\n", pbuf); printf("---------------------------data end------------------------------\n"); } return 0; }