Example #1
0
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;
}
Example #3
0
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;
}