打印IP地址以及网络数据包的方式

来源:互联网 发布:java求1到200内的素数 编辑:程序博客网 时间:2024/05/18 09:10

打印网络数据包的方式

if (skb && skb->input_dev && (skb->srcPhyPort == 4))
{
         char *buf = skb->data;
         int len = skb->len;
         int i;
 
         printk("[%s:%d]Packet length = %#4x\n", __FUNCTION__, __LINE__, len);
         for (i = 0; i < len; i++){
                 if (i % 16 == 0) printk("%#4.4x", i);// 打印行号
                 if (i % 2 == 0) printk(" "); // 给每个数字之间添加一个空格
                 printk("%2.2x", ((unsigned char *)buf)[i]);// 打印一个字节的数字
                if (i % 16 == 15) printk("\n"); // 每行只存放15个数字,超过15个就换行
         }
         printk("\n\n\n\n");
 }


在内核中打印IP地址(收到的网络数据包的IP地址是网络字节序的,网络字节序是以大端格式存放的):

#define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \
((unsigned char *)&addr)[1], \
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]
#define NIPQUAD_FMT "%u.%u.%u.%u"

printk("masq_inet_event:(%s): %u.%u.%u.%u, errno=%d\n", "add_natip",
NIPQUAD(ina->ifa_local), rc);

// 想想为什么宏打印是从位置0开始打印,先从位置3开始打印会是怎么样


在内核中打印MAC地址的方式

在内核协议栈中dev_queue_xmit函数中获取传入数据包得报文信息:
      struct iphdr * iph;
        struct tcphdr *tcph;
        unsigned char src_eth_addr[ETH_ALEN],dst_eth_addr[ETH_ALEN];
        struct ethhdr     *oeth;
        __be32 src_addr,dst_addr;
        __be16 src_port,dst_port;
        u32         tcplen;


        iph = ip_hdr(skb);
        if (skb->mac_header != NULL) 
        {
            oeth = (struct ethhdr *)skb->mac_header;
            memcpy( src_eth_addr, oeth->h_source, ETH_ALEN );
            memcpy( dst_eth_addr, oeth->h_dest, ETH_ALEN );


        printk("sport=%d dport=%d\n",src_port,dst_port);


printk("srcmac=%02x02x%02x%02x%02x%02x dstmac=%02x%02x%02x%02x%02x%02x",
                    src_eth_addr[0],src_eth_addr[1],src_eth_addr[2],src_eth_addr[3],
                    src_eth_addr[4],src_eth_addr[5],dst_eth_addr[0],dst_eth_addr[1],
                    dst_eth_addr[2],dst_eth_addr[3],dst_eth_addr[4],dst_eth_addr[5]);
        }
        tcph  = (struct tcphdr *)((u_int32_t *)iph + iph->ihl);
        dst_addr = iph->daddr;
        src_addr = iph->saddr;
        printk("src_addr=%08x dst_addr=%08x",src_addr,dst_addr);
        
        // tcp
        src_port = tcph->source;

原创粉丝点击