我們開發了用於電力線通信的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;
}