免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10222 | 回复: 6
打印 上一主题 下一主题

大家帮忙看看,为什么上层取不到数据,谢谢! [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-22 11:29 |只看该作者 |倒序浏览
本帖最后由 shaohui973 于 2013-07-22 11:31 编辑

程序一开始,首先创建一个socket,用于DHCP服务,并且配置过滤规则如下:
                                       BPF_STMT(BPF_LD+BPF_H+BPF_ABS,12),                          /*eth type*/
                                       BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0X0800,0,5),           /*ip*/
                                       BPF_STMT(BPF_LD+BPF_H+BPF_ABS,23),                          
                                       BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0X11,0,3),                /*udp proto*/
                                       BPF_STMT(BPF_LD+BPF_H+BPF_ABS,36),
                                       BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, DHCP_SERVER_PORT,0,1),
                                       BPF_STMT(BPF_RET+BPF_K,-1),                                            /* keep packet */
                                       BPF_STMT(BPF_RET+BPF_K,0)                                              /* drop packet */

在DHCP完成后,又另外创建了一个socket,用于和DSP芯片通信,并且配置过滤规则如下:
                                       BPF_STMT(BPF_LD+BPF_H+BPF_ABS,12),
                                       BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, cOCTPKT_HDR_ETHERTYPE,0,1),    /* DSP 私有协议 */
                                       BPF_STMT(BPF_RET+BPF_K,-1),                                            /* keep packet */
                                       BPF_STMT(BPF_RET+BPF_K,0)                                              /* drop packet */

现有一个线程一直在轮寻检测dsp的socket,有数据就马上取出来。
通过抓包来看,DSP把请求的响应包发给我了,但是dsp的这个线程就是取不到这个数据。

这个BPF机制是不是不能用多个有冲突的规则的???我现在比较怀疑这点。



附:socket均为PF_PACKET的RAW socket.过滤规则都是作用在同一块网卡上的。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
2 [报告]
发表于 2013-07-22 13:19 |只看该作者
怎么都是看客啊

论坛徽章:
0
3 [报告]
发表于 2013-07-22 13:43 |只看该作者
都是高手呀,我就是程序盲:wink:

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
4 [报告]
发表于 2013-07-22 13:45 |只看该作者
回复 3# yjl


    谢谢帮顶,可以引来高手哈

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
5 [报告]
发表于 2013-07-22 14:51 |只看该作者
看了下内核代码:
在pf_packet 的socket收到数据后,调用socket的回调钩子函数,并调用过滤器。
static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
1589               struct packet_type *pt, struct net_device *orig_dev)
1590 {
1591     struct sock *sk;
1592     struct sockaddr_ll *sll;
1593     struct packet_sock *po;
1594     u8 *skb_head = skb->data;
1595     int skb_len = skb->len;
1596     unsigned int snaplen, res;
1597
1598     if (skb->pkt_type == PACKET_LOOPBACK)
1599         goto drop;
1600
1601     sk = pt->af_packet_priv;
1602     po = pkt_sk(sk);
1603
1604     if (!net_eq(dev_net(dev), sock_net(sk)))
1605         goto drop;
1606
1607     skb->dev = dev;
1609     if (dev->header_ops) {
1610         /* The device has an explicit notion of ll header,
1611          * exported to higher levels.
1612          *
1613          * Otherwise, the device hides details of its frame
1614          * structure, so that corresponding packet head is
1615          * never delivered to user.
1616          */
1617         if (sk->sk_type != SOCK_DGRAM)
1618             skb_push(skb, skb->data - skb_mac_header(skb));
1619         else if (skb->pkt_type == PACKET_OUTGOING) {
1620             /* Special case: outgoing packets have ll header at head */
1621             skb_pull(skb, skb_network_offset(skb));
1622         }
1623     }
1624
1625     snaplen = skb->len;
1626
1627     res = run_filter(skb, sk, snaplen);     /*结合过滤规则,收到正确的包,这里返回-1*/
1628     if (!res)
1629         goto drop_n_restore;
1630     if (snaplen > res)
1631         snaplen = res;
1632
1633     if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
1634         goto drop_n_acct;
1635
1636     if (skb_shared(skb)) {
1637         struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);
1638         if (nskb == NULL)
1639             goto drop_n_acct;
1640
1641         if (skb_head != skb->data) {
1642             skb->data = skb_head;
1643             skb->len = skb_len;
1644         }
1645         kfree_skb(skb);
1646         skb = nskb;
1647     }
1648
1649     BUILD_BUG_ON(sizeof(*PACKET_SKB_CB(skb)) + MAX_ADDR_LEN - 8 >
1650              sizeof(skb->cb));
1651
1652     sll = &PACKET_SKB_CB(skb)->sa.ll;
1653     sll->sll_family = AF_PACKET;
1654     sll->sll_hatype = dev->type;
1655     sll->sll_protocol = skb->protocol;
1656     sll->sll_pkttype = skb->pkt_type;
1657     if (unlikely(po->origdev))
1658         sll->sll_ifindex = orig_dev->ifindex;
1659     else
1660         sll->sll_ifindex = dev->ifindex;
1661
1662     sll->sll_halen = dev_parse_header(skb, sll->sll_addr);
1663
1664     PACKET_SKB_CB(skb)->origlen = skb->len;
1665
1666     if (pskb_trim(skb, snaplen))
1667         goto drop_n_acct;
1668
1669     skb_set_owner_r(skb, sk);
1670     skb->dev = NULL;
1671     skb_dst_drop(skb);
1672
1673     /* drop conntrack reference */
1674     nf_reset(skb);
1675
1676     spin_lock(&sk->sk_receive_queue.lock);
1677     po->stats.tp_packets++;
1678     skb->dropcount = atomic_read(&sk->sk_drops);
1679     __skb_queue_tail(&sk->sk_receive_queue, skb);
1680     spin_unlock(&sk->sk_receive_queue.lock);
1681     sk->sk_data_ready(sk, skb->len);
1682     return 0;
1683
1684 drop_n_acct:
1685     spin_lock(&sk->sk_receive_queue.lock);
1686     po->stats.tp_drops++;
1687     atomic_inc(&sk->sk_drops);
1688     spin_unlock(&sk->sk_receive_queue.lock);
1689
1690 drop_n_restore:
1691     if (skb_head != skb->data && skb_shared(skb)) {
1692         skb->data = skb_head;
1693         skb->len = skb_len;
1694     }
1695 drop:
1696     consume_skb(skb);
1697     return 0;
1698 }

从这段代码来看,我怀疑的是不正确的。但是还有什么原因会导致上层收不到包呢?Iptables功能我已经关闭了。

论坛徽章:
0
6 [报告]
发表于 2013-07-22 16:28 |只看该作者
MAC地址对么,没细看,先想到的是这个

论坛徽章:
0
7 [报告]
发表于 2013-08-01 15:54 |只看该作者
看不懂,帮顶!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP