2012-10-30 110 views
2

我想在Linux內核中實現netdevice(net_device)。這是簡單的net_device,它將用戶空間的命令/數據傳遞給內核空間,反之亦然,這是這個簡單的net_device的目標。我使用套接字將命令/數據從用戶空間傳遞到內核空間。谷歌搜索後,我successed在登記的net_device並能看到我的/ SYS /班/ NET/abc0設備(設備名稱) 來文件操作時,有流量在Linux內核中開發簡單的net_device

struct net_device_ops 
{ 
    .ndo_open =open, 

    .ndo_close = close, 

    .ndo_start_xmit = start_xmit 
} 
  • 沒有明確的想法如果我發出插座它會在數據鏈路層調用start_xmit。

  • 如果我要調用open方法,如何調用它使用插座

  • 如何調用start_xmit使用插座

  • 我怎麼會發現,有數據包中接收緩衝區並將其傳遞給用戶空間。

有大約簡單的net_device(除以太網)沒有明確的流程/信息可以在任何提示的鏈接/ PDF。

我試着編寫簡單的socket程序來測試open,close,start_xmit。套接字讀/寫未調用open,close,star_xmit。 有什麼方法可以測試開發的net_device嗎?

謝謝

回答

1

我發現如何測試開啓,關閉功能。

  • 類型:使用ifconfig abc0(設備名稱)最多將調用open方法

  • 類型:使用ifconfig abc0(設備名稱)跌調用close方法

能有人幫我如何用套接字測試這些方法。

1

SIOCSIFFLAGS, - > IFF_UP你可以實際設置或取消設置,同時做一個ioctl到netdevice abc0。

第一關必須創建一個套接字DGRAM,

然後使用的ifreq在net/if.h中

定義的結構和填充接口和iff_flags

iff_flags可以與IFF_UP或可設置用相同的IFF_UP取消,使接口down掉

然後關閉套接字。

#include <net/if.h> 

.... 

sock = socket(AF_INET, SOCK_DGRAM, 0); 

if (sock < 0) { 

    goto fail; 

} 

struct ifreq ifreq; 

strcpy(ifreq.ifr_name, "abcd0"); 

ifreq.iff_flags |= IFF_UP; 

if (ioctl(sock, &ifreq, sizeof(ifreq) < 0) { 

    perror("ioctl setting interface up"); 

} 

ifreq.iff_flags ~= IFF_UP; 

if (ioctl(sock, &ifreq, sizeof(ifreq) < 0) { 

    perror("ioctl setting interface down"); 

} 

close(sock); 

offtopic:

請你分享你的代碼?我們也可以瞭解你的網絡設備:)