- 论坛徽章:
- 2
|
本帖最后由 duoniK 于 2014-04-08 18:10 编辑
想跟踪 网络中 skb->csum 这个变量在 网络传输中怎么变化,请问大家都用哪种工具或手段啊?
能否像gdb那样 单步调试,跟踪 某一变量的变化呢?
谢谢
另外,想将 skb_add_skb 这个函数 复制和校验和 两个功能分开
修改函数如下:
net/ipv4/tcp.c
Tcp_sendmsg {
---- if ((err = skb_add_data(skb, from, copy)) != 0)
---- goto do_fault;
+++ if ((err = my_skb_add_data(skb, from, copy)) != 0) //此处没有进行校验和 skb->csum, 只是复制数据
+++ goto do_fault;
}
net/ipv4/tcp_output.c
tcp_write_xmit {
+++ my_csum_skb(skb); //在此计算 skb->csum
if (unlikely(tcp_transmit_skb(sk, skb, 1, gfp)))
}
static inline int my_skb_add_data(struct sk_buff *skb,
char __user *from, int copy)
{
const int off = skb->len;
if (skb->ip_summed == CHECKSUM_NONE) {
if (!copy_from_user(skb_put(skb, copy), from, copy))
return 0;
}
__skb_trim(skb, off);
return -EFAULT;
}
static inline int my_csum_skb(struct sk_buff *skb)
{
const int off = skb->len;
if (skb->ip_summed == CHECKSUM_NONE) {
__wsum csum = csum_partial(skb->data, skb->len, 0);
printk("before skb->csum:%ud\n", skb->csum);
skb->csum = csum_block_add(skb->csum, csum, off);
printk("after skb->csum:%ud, csum:%ud\n", skb->csum, csum);
return 0;
}
return -EFAULT;
}
因为skb->csum这块出了问题,所以想 跟踪下 skb->csum 的变化,大家有什么好的调试方法么?谢谢
|
|