fabricを使用するLinuxでネットワークモジュール/ドライバを実装していますnet_devices
。これまでは、insmod
コマンドを使用してカーネルスペースからモジュールを追加および削除できました。これにより、ifconfig
新しく作成されたインターフェイスのIPを設定し、pingパケットを送信できます。今やるべきことは、関数sk_buff
内のパケットをキャプチャndo_start_xmit
し、UART物理コネクタを介して送受信することです。つまり、ユーザー空間アプリケーションと同様に、/dev/tty*
ファイル記述子()を介してttyデバイスを開いて送信するために書き込んで(そして受信するために読んで)、何とかカーネル空間で検出するか、または私のデバイス(私のネットワークモジュール内)を見つけて送信する必要があります。または、RxおよびTxラインを介してデータを受信します。私のドライバは次のとおりです。
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/kernel.h>
#include <linux/etherdevice.h>
struct net_device *mynet;
int mynet_open(struct net_device *dev) {
printk(KERN_ALERT "open called\n");
return 0;
}
int mynet_release(struct net_device *dev) {
printk(KERN_ALERT "release called\n");
netif_stop_queue(dev);
return 0;
}
int mynet_xmit(struct sk_buff *skb, struct net_device *dev) {
printk(KERN_ALERT "dummy xmit function called...\n");
///////// UART SEND HERE /////////
dev_kfree_skb(skb);
return 0;
}
int mynet_init(struct net_device *dev) {
printk(KERN_ALERT "gohmnet0 device initialized\n");
return 0;
}
const struct net_device_ops my_netdev_ops = {
.ndo_init = mynet_init,
.ndo_open = mynet_open,
.ndo_stop = mynet_release,
.ndo_start_xmit = mynet_xmit,
};
static void virtual_setup(struct net_device *dev){
dev->netdev_ops = &my_netdev_ops;
}
int mynet_init_module(void) {
int result;
mynet = alloc_netdev(0, "mynet",NET_NAME_UNKNOWN, virtual_setup);
if((result = register_netdev(mynet)))
{
printk(KERN_ALERT "mynet: Error %d initalizing card ...", result);
return result;
}
return 0;
}
void mynet_cleanup (void)
{
printk (KERN_ALERT "<0> Cleaning Up the Module\n");
unregister_netdev (mynet);
}
module_init(mynet_init_module);
module_exit(mynet_cleanup);
MODULE_LICENSE("GPL");
PS:次の方法を見てみましたが、交換する必要があるため不可能です。
oldfs = get_fs();
set_fs(get_ds());
filp = filp_open(path, flags, rights);
set_fs(oldfs);
最後に、ユーザースペースに行き来する必要なく、私のモジュール/ドライバのカーネルスペースでUARTドライバを使用する必要があるようです。