您的位置:首页 > 理论基础 > 计算机网络

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

2013-08-08 10:06 417 查看
打印网络数据包的方式

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: