2013-04-10 112 views
0

我們開發了用於電力線通信的ASIC,並正在爲此開發以太網設備驅動程序。該芯片通過串行外設接口連接到我們的主處理器(iMX233 ARM9)。我們開發的內核模塊在加載時註冊一個以太網設備「gvspi」。收到時。我們從ASIC上通過SPI獲取以太網幀並將其存儲在一個字節數組中,然後分配一個sk_buff,將數組中的數據應用到該sk_buff並將其傳遞到TCP/IP層。在發送過程中,我們通過SPI將以太網幀(通過sk_buff-> data檢索的字節數組)發送到ASIC,然後將其發送到電力線上。TCP不能用於自定義網絡設備驅動程序

我們有這樣的設置:

ARM委員會1 --SPI - >ASIC ---電源線--->ASIC --SPI - >ARM Board2

運行的Linux內核版本2.6.31

兩個ARM板我們能夠ping使用我們的司機相互ARM板(使用ping)。 我們可以在ARM板之間雙向交換UDP數據包(使用iperf)。 但我們無法建立兩個板之間的TCP連接(使用telnet/telnetd或iperf)。

似乎只有包含TCP的幀沒有被TCP/IP層處理。情況會是這樣嗎?在將它傳遞給上層之前,我們是否正確地填充了sk_buff?

這裏是其產生的驅動程序代碼的適當部分,填充並傳遞的sk_buff到上層(U32 RX_DATA和U8 rx_len存儲剛接收到的以太網幀):

skb1 = alloc_skb((rx_len + NET_IP_ALIGN), GFP_ATOMIC); 
skb_reserve(skb1, NET_IP_ALIGN); 
skb_put(skb1, rx_len); 
memcpy(skb1->data, rx_data, rx_len);    
skb1->protocol = eth_type_trans(skb1,gvspi_dev); 
skb_reset_network_header(skb1); 
skb_reset_transport_header(skb1); 

gvspi_dev->stats.rx_bytes += skb1->len; 
gvspi_dev->stats.rx_packets++; 

printk("Frame sent to TCP/IP layer..."); 

if (netif_rx_ni (skb1) != NET_RX_SUCCESS) { 
    kfree_skb (skb1); 
    gvspi_dev->stats.rx_dropped++;  
    return ERROR; 
} 

回答

0

所以我們能夠找出問題 - RTFM分類問題。 我們已經分配了定製的以太網驅動器的MAC地址作爲11:22:33:44:55:66,它當然是一個多播地址(見圖here

此外,誰想要的詳細信息: 看內核源程序的tcp_ipv4.c中的tcp_v4_rcv()的行號1615

每當我們使用多播MAC地址時,發送到此TCPv4接收函數的sk_buff從下層預置爲PACKET_MULTICAST。 因此,此時sk_buff被拒絕,因爲接收到的幀並沒有按照TCP的要求專門指向我們的主機。組播只在UDP等無連接協議中有效。