- 论坛徽章:
- 1
|
本帖最后由 jiufei19 于 2016-10-21 14:18 编辑
为了更清楚表明我的问题,下面我列出用户进程读取udp数据报的代码调用过程
udp_recvmsg-->skb_recv_datagram-->skb_copy_datagram_iovec
247 int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset,
248 struct iovec *to, int len)
249 {
... ...
254 if (copy > 0) {
... ...
257 if (memcpy_toiovec(to, skb->data + offset, copy))
... ...
262 }
265 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
... ...
290 }
291
292 if (skb_shinfo(skb)->frag_list) {
... ... // 这里是递归调用skb_copy_datagram_iovec,所以这个问题解决了
314 }
... ..
上述红色代码即是客户端读取udp数据报的操作,分别从skb的主buffer、frags[]内存页、frag_list这三个地方读取数据,因此如果head本身带有frag_list链表,并且其又在pq->fragments链表上通过next指针与后续分段链接的话,那么重组成功后,就会出现我这里说的混乱现象。
到底是咋回事?========》递归调用解决此问题了,没有混乱! |
|