Linux驅動之網路驅動應用

2021-10-01 20:49:20 字數 3077 閱讀 9882

#include

#include

#include

/* printk() */

#include

/* kmalloc() */

#include

/* error codes */

#include

/* size_t */

#include

/* mark_bh */

#include

#include

/* struct device, and other headers */

#include

/* eth_type_trans */

#include

/* struct iphdr */

#include

/* struct tcphdr */

#include

#include

#include

#include

#include

#include

//如果需要隨機mac位址則定義該巨集

#define mac_auto

static

struct net_device *mynet_devs;

//網路裝置結構體,作為net_device->priv

struct mynet_priv

;//網路介面的開啟函式

intmynet_open

(struct net_device *dev)

intmynet_release

(struct net_device *dev)

//接包函式

void

mynet_rx

(struct net_device *dev,

int len,

unsigned

char

*buf)

skb_reserve

(skb,2)

;memcpy

(skb_put

(skb,len)

,buf,len)

;//skb_put是把資料寫入到socket buffer

skb->dev = dev;

skb->protocol =

eth_type_trans

(skb,dev)

;//返回的是協議號

skb->ip_summed = checksum_unnecessary;

//此處不校驗

priv->stats.rx_packets++

;//接收到包的個數加1

priv->stats.rx_bytes +

= len;

//接收到包的長度

printk

("mtnet rx \n");

netif_rx

(skb)

;//通知核心已經接收到包,並且封裝成socket buffer傳到上層

return;}

//真正的處理的傳送資料報

//模擬乙個網路向另乙個網路傳送資料報

void

mynet_hw_tx

(char

*buf,

int len,

struct net_device *dev)

dest = mynet_devs;

priv =

(struct mynet_priv *

)dest->ml_priv;

//目標dest中的priv

priv->rx_packetlen = len;

priv->rx_packtdata = buf;

printk

("mynet tx \n");

dev_kfree_skb

(priv->skb);}

//發包函式

void

mynet_tx

(struct sk_buff *skb,

struct net_device *dev)

len =skb->len < eth_zlen ? eth_zlen : skb->len;

//eth_zlen是所發的最小的資料報長度

data = skb->data;

//將要傳送的資料報中的資料部分

priv->skb = skb;

mynet_hw_tx

(data,len,dev)

;//真正的傳送函式

return0;

}//裝置初始化函式

intmynet_init

(struct net_device *dev)

static

const

struct net_device_ops mt_netdev_ops =

;static

void

my_plat_net_release

(struct device * dev)

static

int __devinit my_net_probe

(struct platform_device * pdev)

static

int __devexit aston_net_remove

(struct platform_device *pdev)

//裝置移除介面

static

struct platform_device my_net =,}

;static

struct platform_driver my_net_driver =,}

;static

intmy_net_init

(void

)static

void

my_net_exit

(void

)module_init

(my_net_init)

;module_exit

(my_net_exit)

;module_license

("gpl"

);

編譯成功並載入.ko檔案後,使用ifconfig命令即可看見新的乙個虛擬網絡卡出現。

linux驅動之 led驅動

練手,第乙個字元驅動.用模組載入方法 華清遠見 嵌入式linux裝置驅動開發詳解 的 拿來改的.編譯過程發現很多錯誤.最後發現 這本書帶的驅動 都是基於linux2.4的.目前我用的linux2.6,部分需要做修改.我的板子是 友善之臂的 2410.vmware ubuntu nfs交叉編譯 首先 ...

linux驅動之塊裝置驅動

塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...

Linux驅動開發之DRM驅動

qq群 852283276 b站 主頁 drm 驅動程式開發 開篇 drm 驅動程式開發 vkms 最簡單的drm應用程式 single buffer drm 驅動是如何建立 fb device 的 linux中的drm 介紹 linux graphic dri 顯示子系統 介紹1 xilinx d...