fabric 을 사용하는 Linux에서 네트워크 모듈/드라이버를 구현하고 있습니다 net_devices
. 지금까지 나는 insmod
명령을 사용하여 커널 공간에서 모듈을 추가하고 제거 할 수 있었습니다 . 이를 통해 ifconfig
새로 생성된 인터페이스에 대한 IP를 설정하고 핑 패킷을 보낼 수 있었습니다. 지금 해야 할 일은 함수 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");
추신: 다음 방법을 살펴보았는데 교체해야 하므로 불가능합니다.
oldfs = get_fs();
set_fs(get_ds());
filp = filp_open(path, flags, rights);
set_fs(oldfs);
마지막으로, 사용자 공간으로 왔다 갔다 할 필요 없이 내 모듈/드라이버의 커널 공간에서 UART 드라이버를 사용해야 하는 것 같습니다.