+ -
当前位置:首页 → 问答吧 → 有个pppoe发送问题

有个pppoe发送问题

时间:2010-08-11

来源:互联网

发送报文时候 dev_queue_xmit->dev_hard_start_xmit->ppp_xmit->ppp_push->pppoe_xmit


pppoe_xmit里面又调用dev_queue_xmit, 我的问题就在这里,


通过分析pppoe_xmit发现它调用dev_queue_xmit里面传的dev是pppox_sk(sk)获得的, 具体分析

pppox_sk(sk)中的dev是在pppoe_connect中获得:
  1.         dev = dev_get_by_name(sp->sa_addr.pppoe.dev);

  2.                 error = -ENODEV;
  3.                 if (!dev)
  4.                         goto end;

  5.                 po->pppoe_dev = dev;
复制代码
从这看是根据 sp->sa_addr.pppoe.dev名字得到dev的结构, 那么sp->sa_addr.pppoe.dev这个名字是指物理口的名字吗?

作者: Arthur_   发布时间: 2010-08-11

哦, 我知道我的问题了。

之前我一直在hard_start_xmit地方获取skb->nfct拿CT信息做统计, 测试发现拨号的时候只能统计到逻辑口信息(ppp0),但统计不到物理口信息。 分析了ppp的发送流程发现在最后pppoe_xmit时候:
  1. /* Copy the skb if there is no space for the header. */
  2.         if (headroom < (sizeof(struct pppoe_hdr) + dev->hard_header_len)) { ============>[1]
  3.                 skb2 = dev_alloc_skb(32+skb->len +
  4.                                      sizeof(struct pppoe_hdr) +
  5.                                      dev->hard_header_len);

  6.                 if (skb2 == NULL)
  7.                         goto abort;

  8.                 skb_reserve(skb2, dev->hard_header_len + sizeof(struct pppoe_hdr));
  9.                 memcpy(skb_put(skb2, skb->len), skb->data, skb->len);
  10.         } else {
  11.                 /* Make a clone so as to not disturb the original skb,
  12.                  * give dev_queue_xmit something it can free.
  13.                  */
  14.                 skb2 = skb_clone(skb, GFP_ATOMIC);

  15.                 if (skb2 == NULL)
  16.                         goto abort;
  17.         }
复制代码
由于统计的转发信息, 所以基本上都会走[1]的流程, 这个流程没有将原始的skb->nfct 拷贝到skb2中, 而skb2被发送到物理口上了, 所以我没有CT就不会在继续统计了。

作者: Arthur_   发布时间: 2010-08-11

发个牢骚 这设计的有点不合理。
skb2也有可能是cloned过来的 这个时候就有nfct信息以及其它信息了。

这样的话, 有的时候SKB2不包含这些信息, 有的时候包含, 怎么不统一下呢?!!!!

作者: Arthur_   发布时间: 2010-08-11

热门下载

更多