Пример #1
0
void
print_ipv4(
	int fd,
	char *datagram)
{
	struct ipv4_header *iph;
	iph = (struct ipv4_header *) datagram;

	print_proto(fd,"[IPv4/ version:%hhd ipheaderlen:%hhd tos:%#x totlen:%d "
		"id:%#x fragoffset:%#x ttl:%hhu proto:%hhd checksum:%#x "
		"source:%s dest:%s]",FLAG_VAL(iph->lenvers,IPV4_VERS,4),
		FLAG_VAL(iph->lenvers,IPV4_HDRLEN,0),iph->tos,
		ntohs(iph->totlen),ntohs(iph->id), ntohs(iph->fragoffset),
		iph->ttl,iph->proto,ntohs(iph->ipchecksum),
		ipv4_ntoa(ntohl(iph->sourceaddr),sourceip),
		ipv4_ntoa(ntohl(iph->destaddr), destip));
}
Пример #2
0
static void print_sk_buff(unsigned int hooknum, struct sk_buff *skb)
{
    struct ethhdr *ethh = eth_hdr(skb);
    struct iphdr *iph = ip_hdr(skb);
    struct tcphdr *tcph = NULL;
    struct udphdr *udph = NULL;
    int i;
    unsigned short tcp_data_len = 0;
    unsigned char *tcp_data = NULL;
    unsigned short udp_data_len = 0;
    unsigned char *udp_data = NULL;

#if 1
    if (iph->protocol != IPPROTO_TCP)
    {
        return;
    }
#endif

    switch (hooknum)
    {
    case NF_INET_PRE_ROUTING:
        printk("\nPre Routing <%d>\n", ++g_cnt);
        break;

    case NF_INET_LOCAL_IN:
        printk("\nLocal In <%d>\n", ++g_cnt);
        break;

    case NF_INET_FORWARD:
        printk("\nForward <%d>\n", ++g_cnt);
        break;

    case NF_INET_LOCAL_OUT:
        printk("\nLocal Out <%d>\n", ++g_cnt);
        break;

    case NF_INET_POST_ROUTING:
        printk("\nPost Routing <%d>\n", ++g_cnt);
        break;

    default:
        return;
    }

    //mac
    if (ethh)
    {
        printk("Src MAC: <%x:%x:%x:%x:%x:%x>\n", \
            ethh->h_source[0], ethh->h_source[1], ethh->h_source[2], \
            ethh->h_source[3], ethh->h_source[4], ethh->h_source[5]);
        printk("Dest MAC: <%x:%x:%x:%x:%x:%x>\n", \
            ethh->h_dest[0], ethh->h_dest[1], ethh->h_dest[2], \
            ethh->h_dest[3], ethh->h_dest[4], ethh->h_dest[5]);
    }
    else
    {
        printk("ethh = NULL\n");
    }

    //ip
    if (iph)
    {
        printk("Src Ip: <%s>\n", ipv4_ntoa(iph->saddr));
        printk("Dest Ip: <%s>\n", ipv4_ntoa(iph->daddr));

        //TCP、UDP、ICMP、IGMP
        switch (iph->protocol)
        {
        case IPPROTO_ICMP:
            printk("ICMP:\n");
            break;

        case IPPROTO_IGMP:
            printk("IGMP:\n");
            break;

        case IPPROTO_TCP:
            printk("TCP:\n");
            tcph = (struct tcphdr *)(skb->data + iph->ihl * 4);
            printk("Src port: <%u>\n", ntohs(tcph->source));
            printk("Dest port: <%u>\n", ntohs(tcph->dest));
            printk("Seq: <%u>\n", ntohl(tcph->seq));
            printk("Ack seq: <%u>\n", ntohl(tcph->ack_seq));
            printk("urg: <%d>, ack: <%d>\n", tcph->urg, tcph->ack);
            printk("psh: <%d>, rst: <%d>\n", tcph->psh, tcph->rst);
            printk("syn: <%d>, fin: <%d>\n", tcph->syn, tcph->fin);
            //printk("tot len = <%u>\n", ntohs(iph->tot_len));
            //printk("ihl * 4 = <%u>\n", iph->ihl * 4);
            //printk("doff * 4 = <%u>\n", tcph->doff * 4);
            tcp_data_len = ntohs(iph->tot_len) - iph->ihl * 4 - tcph->doff * 4;
            printk("tcp data len = <%u>\n", tcp_data_len);
            if (tcp_data_len > 0)
            {
                tcp_data = skb->data + iph->ihl * 4 + tcph->doff * 4;
                printk("tcp data: ");
                for (i = 0; i < tcp_data_len; i++)
                {
                    printk("%x ", tcp_data[i]);
                }
                printk("\n");
            }
            break;

        case IPPROTO_UDP:
            printk("UDP:\n");
            udph = (struct udphdr *)(skb->data + iph->ihl * 4);
            printk("Src port = <%u>\n", ntohs(udph->source));
            printk("Dest port = <%u>\n", ntohs(udph->dest));
            udp_data_len = ntohs(iph->tot_len) - iph->ihl * 4 - 8;
            printk("udp data len = <%u>\n", udp_data_len);
            if (udp_data_len > 0)
            {
                udp_data = skb->data + iph->ihl * 4 + 8;
                printk("udp data: ");
                for (i = 0; i < udp_data_len; i++)
                {
                    printk("%x ", udp_data[i]);
                }
                printk("\n");
            }
            break;

        default:
            printk("Others protocol <%u>\n", iph->protocol);
        }
    }
    else
    {
        printk("iph = NULL\n");
    }
}