免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 请教各位一个关于网络通信的问题 [复制链接]

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-15 13:25 |只看该作者 |倒序浏览
本帖最后由 九阳神功爱喝茶 于 2015-01-15 13:27 编辑

小弟现在在导师的要求下,研究无线网卡开源驱动程序Ath9k和MAC层的一些程序,现在遇到些问题,想和大家讨论下,还请多多指教,不甚感激。
1.我老师想根据接收到的ACK信息判断是哪个站点传输过来的,做进一步的研究。我跟踪了代码,结果发现没有接受的时候没处理这个啊。下面是源代码。

  1. /*
  2. * This is the actual Rx frames handler. as it belongs to Rx path it must
  3. * be called with rcu_read_lock protection.
  4. noted by shenlei 2014 12 11 to notice that this is the  actual Rx frames handler
  5. */
  6. static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
  7.                                          struct sk_buff *skb)
  8. {
  9.         struct ieee80211_local *local = hw_to_local(hw);
  10.         struct ieee80211_sub_if_data *sdata;
  11.         struct ieee80211_hdr *hdr;
  12.         __le16 fc;
  13.         struct ieee80211_rx_data rx;
  14.         struct ieee80211_sub_if_data *prev;
  15.         struct sta_info *sta, *tmp, *prev_sta;
  16.         int err = 0;

  17.         fc = ((struct ieee80211_hdr *)skb->data)->frame_control;
  18.         memset(&rx, 0, sizeof(rx));
  19.         rx.skb = skb;
  20.         rx.local = local;

  21.         if (ieee80211_is_data(fc) || ieee80211_is_mgmt(fc))
  22.                 local->dot11ReceivedFragmentCount++;
  23. //serveral error type noted by shenlei 2014 12 11
  24.         if (ieee80211_is_mgmt(fc)) {
  25.                 /* drop frame if too short for header */
  26.                 if (skb->len < ieee80211_hdrlen(fc))
  27.                         err = -ENOBUFS;
  28.                 else
  29. /**
  30.   *      skb_linearize - convert paged skb to linear one
  31.   *      @skb: buffer to linarize
  32.   *
  33.   *      If there is no free memory -ENOMEM is returned, otherwise zero
  34.   *      is returned and the old skb data released.
  35.   */
  36.                         err = skb_linearize(skb);
  37.         } else {
  38.                 err = !pskb_may_pull(skb, ieee80211_hdrlen(fc));
  39.         }

  40.         if (err) {
  41.                 dev_kfree_skb(skb);
  42.                 return;
  43.         }

  44.         hdr = (struct ieee80211_hdr *)skb->data;
  45.         ieee80211_parse_qos(&rx);
  46.         ieee80211_verify_alignment(&rx);

  47.         [color=Red]if (unlikely(ieee80211_is_probe_resp(hdr->frame_control)[/color] ||
  48.                      ieee80211_is_beacon(hdr->frame_control)))
  49.                 ieee80211_scan_rx(local, skb);

  50.         [color=Red]if (ieee80211_is_data(fc))[/color] {
  51.                 prev_sta = NULL;

  52.                 for_each_sta_info(local, hdr->addr2, sta, tmp) {
  53.                         if (!prev_sta) {
  54.                                 prev_sta = sta;
  55.                                 continue;
  56.                         }

  57.                         rx.sta = prev_sta;
  58.                         rx.sdata = prev_sta->sdata;
  59.                         ieee80211_prepare_and_rx_handle(&rx, skb, false);

  60.                         prev_sta = sta;
  61.                 }

  62.                 if (prev_sta) {
  63.                         rx.sta = prev_sta;
  64.                         rx.sdata = prev_sta->sdata;

  65.                         if (ieee80211_prepare_and_rx_handle(&rx, skb, true))
  66.                                 return;
  67.                         goto out;
  68.                 }
  69.         }

  70.         prev = NULL;

  71.         list_for_each_entry_rcu(sdata, &local->interfaces, list) {
  72.                 if (!ieee80211_sdata_running(sdata))
  73.                         continue;

  74.                 if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
  75.                     sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
  76.                         continue;

  77.                 /*
  78.                  * frame is destined for this interface, but if it's
  79.                  * not also for the previous one we handle that after
  80.                  * the loop to avoid copying the SKB once too much
  81.                  */

  82.                 if (!prev) {
  83.                         prev = sdata;
  84.                         continue;
  85.                 }

  86.                 rx.sta = sta_info_get_bss(prev, hdr->addr2);
  87.                 rx.sdata = prev;
  88.                 ieee80211_prepare_and_rx_handle(&rx, skb, false);

  89.                 prev = sdata;
  90.         }

  91.         if (prev) {
  92.                 rx.sta = sta_info_get_bss(prev, hdr->addr2);
  93.                 rx.sdata = prev;

  94.                 if (ieee80211_prepare_and_rx_handle(&rx, skb, true))
  95.                         return;
  96.         }

  97. out:
  98.         dev_kfree_skb(skb);
  99. }
复制代码
根据这部分代码可以清楚地看到接受部分分别处理了一般的数据帧和管理帧Beacon和探测帧ieee80211_is_probe_resp。然后我顺着探测帧接着往下找,仍然没找到ACK,我猜测ACK是做在硬件上的,不知道各位前辈怎么人为的。

第二个问题是:重传次数的确定,关于重传次数我找到两个地方,如下:
第一个是初始化时候的
  1. //noted by shenlei 2015 01 03 retry time rts cts threshold and the coverage_class
  2.         rdev->wiphy.retry_short = 7;
  3.         rdev->wiphy.retry_long = 4;
  4.         rdev->wiphy.frag_threshold = (u32) -1;
  5.         rdev->wiphy.rts_threshold = (u32) -1;
  6.         rdev->wiphy.coverage_class = 0;
复制代码
第二个是填充ath_tx_info时候关于重传次数这里用的是在函数ath_buf_set_rate中有一个
  1. struct ieee80211_tx_rate *rates;
  2.          rates = bf->rates;
复制代码
然后我跟了下,发现这个速率是在80211层初始化完成的。
然后我老师想禁止重传,我想的是只需要在这儿重信对这个rates赋值不就好了,还是怎么的?

第三个问题是,我很奇怪几乎所有的控制信息都用info结构体保存,然后调用        ath9k_hw_set_txdesc(ah, bf->bf_desc, &info);写入一个ar5416_desc结构体就好了?难道硬件可以识别这么复杂的结构体?我在想怎么不是写入相应的寄存器呢?还是在哪儿我没找到?

  1. struct ar5416_desc {
  2.         u32 ds_link;
  3.         u32 ds_data;
  4.         u32 ds_ctl0;
  5.         u32 ds_ctl1;
  6.         union {
  7.                 struct {
  8.                         u32 ctl2;
  9.                         u32 ctl3;
  10.                         u32 ctl4;
  11.                         u32 ctl5;
  12.                         u32 ctl6;
  13.                         u32 ctl7;
  14.                         u32 ctl8;
  15.                         u32 ctl9;
  16.                         u32 ctl10;
  17.                         u32 ctl11;
  18.                         u32 status0;
  19.                         u32 status1;
  20.                         u32 status2;
  21.                         u32 status3;
  22.                         u32 status4;
  23.                         u32 status5;
  24.                         u32 status6;
  25.                         u32 status7;
  26.                         u32 status8;
  27.                         u32 status9;
  28.                 } tx;
  29.                 struct {
  30.                         u32 status0;
  31.                         u32 status1;
  32.                         u32 status2;
  33.                         u32 status3;
  34.                         u32 status4;
  35.                         u32 status5;
  36.                         u32 status6;
  37.                         u32 status7;
  38.                         u32 status8;
  39.                 } rx;
  40.         } u;
  41. } __packed __aligned(4);

复制代码

  1. static void
  2. ar9002_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i)
  3. {
  4.         struct ar5416_desc *ads = AR5416DESC(ds);
  5.         u32 ctl1, ctl6;

  6.         ads->ds_txstatus0 = ads->ds_txstatus1 = 0;
  7.         ads->ds_txstatus2 = ads->ds_txstatus3 = 0;
  8.         ads->ds_txstatus4 = ads->ds_txstatus5 = 0;
  9.         ads->ds_txstatus6 = ads->ds_txstatus7 = 0;
  10.         ads->ds_txstatus8 = ads->ds_txstatus9 = 0;

  11.         ACCESS_ONCE(ads->ds_link) = i->link;
  12.         //DMA
  13.         ACCESS_ONCE(ads->ds_data) = i->buf_addr[0];

  14.         ctl1 = i->buf_len[0] | (i->is_last ? 0 : AR_TxMore);
  15.         ctl6 = SM(i->keytype, AR_EncrType);

  16.         if (AR_SREV_9285(ah)) {
  17.                 ads->ds_ctl8 = 0;
  18.                 ads->ds_ctl9 = 0;
  19.                 ads->ds_ctl10 = 0;
  20.                 ads->ds_ctl11 = 0;
  21.         }

  22.         if ((i->is_first || i->is_last) &&
  23.             i->aggr != AGGR_BUF_MIDDLE && i->aggr != AGGR_BUF_LAST) {
  24.                 ACCESS_ONCE(ads->ds_ctl2) = set11nTries(i->rates, 0)
  25.                         | set11nTries(i->rates, 1)
  26.                         | set11nTries(i->rates, 2)
  27.                         | set11nTries(i->rates, 3)
  28.                         | (i->dur_update ? AR_DurUpdateEna : 0)
  29.                         | SM(0, AR_BurstDur);

  30.                 ACCESS_ONCE(ads->ds_ctl3) = set11nRate(i->rates, 0)
  31.                         | set11nRate(i->rates, 1)
  32.                         | set11nRate(i->rates, 2)
  33.                         | set11nRate(i->rates, 3);
  34.         } else {
  35.                 ACCESS_ONCE(ads->ds_ctl2) = 0;
  36.                 ACCESS_ONCE(ads->ds_ctl3) = 0;
  37.         }

  38.         if (!i->is_first) {
  39.                 ACCESS_ONCE(ads->ds_ctl0) = 0;
  40.                 ACCESS_ONCE(ads->ds_ctl1) = ctl1;
  41.                 ACCESS_ONCE(ads->ds_ctl6) = ctl6;
  42.                 return;
  43.         }

  44.         ctl1 |= (i->keyix != ATH9K_TXKEYIX_INVALID ? SM(i->keyix, AR_DestIdx) : 0)
  45.                 | SM(i->type, AR_FrameType)
  46.                 | (i->flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0)
  47.                 | (i->flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0)
  48.                 | (i->flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0);

  49.         switch (i->aggr) {
  50.         case AGGR_BUF_FIRST:
  51.                 ctl6 |= SM(i->aggr_len, AR_AggrLen);
  52.                 /* fall through */
  53.         case AGGR_BUF_MIDDLE:
  54.                 ctl1 |= AR_IsAggr | AR_MoreAggr;
  55.                 ctl6 |= SM(i->ndelim, AR_PadDelim);
  56.                 break;
  57.         case AGGR_BUF_LAST:
  58.                 ctl1 |= AR_IsAggr;
  59.                 break;
  60.         case AGGR_BUF_NONE:
  61.                 break;
  62.         }

  63.         ACCESS_ONCE(ads->ds_ctl0) = (i->pkt_len & AR_FrameLen)
  64.                 | (i->flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0)
  65.                 | SM(i->txpower, AR_XmitPower)
  66.                 | (i->flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0)
  67.                 | (i->flags & ATH9K_TXDESC_INTREQ ? AR_TxIntrReq : 0)
  68.                 | (i->keyix != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0)
  69.                 | (i->flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0)
  70.                 | (i->flags & ATH9K_TXDESC_RTSENA ? AR_RTSEnable :
  71.                    (i->flags & ATH9K_TXDESC_CTSENA ? AR_CTSEnable : 0));

  72.         ACCESS_ONCE(ads->ds_ctl1) = ctl1;
  73.         ACCESS_ONCE(ads->ds_ctl6) = ctl6;

  74.         if (i->aggr == AGGR_BUF_MIDDLE || i->aggr == AGGR_BUF_LAST)
  75.                 return;

  76.         ACCESS_ONCE(ads->ds_ctl4) = set11nPktDurRTSCTS(i->rates, 0)
  77.                 | set11nPktDurRTSCTS(i->rates, 1);

  78.         ACCESS_ONCE(ads->ds_ctl5) = set11nPktDurRTSCTS(i->rates, 2)
  79.                 | set11nPktDurRTSCTS(i->rates, 3);

  80.         ACCESS_ONCE(ads->ds_ctl7) = set11nRateFlags(i->rates, 0)
  81.                 | set11nRateFlags(i->rates, 1)
  82.                 | set11nRateFlags(i->rates, 2)
  83.                 | set11nRateFlags(i->rates, 3)
  84.                 | SM(i->rtscts_rate, AR_RTSCTSRate);
  85. }
复制代码
还希望大家一起讨论下,谢谢。





您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP