linuxネットワークデバイスにおいて重要なデータ構造
2916 ワード
linuxネットワークデバイス構造の中で最も重要な2つのデータ構造struct sk_buffとstuct netdevice
この二つの構造体に対して、彼らの役割は何かを知り、カーネルはいつどのような方法で彼らを操作しますか?
skbuff(ソケットバッファ)は、Linuxネットワークサブシステムの各階層の間でデータを転送するためのネットワークプロトコルインターフェース層に位置し、Linuxネットワークサブシステムのデータ伝達の「中枢神経」である.include/linux/skbuff.hで定義されています.
パケットを送信すると、送信するデータをsk(u)に保存します.buffでは、下層に転送し、対応するプロトコルヘッダを追加してネットワークデバイスに送信する.
パケットを受信すると、sk_にデータを保存したいです.buffでは、上層部に伝達され、上層部は契約ヘッドを剥ぎ、ユーザーに渡すまでになっている.
部分ソースコード:
struct skbuff {}
/* These two memberst. */ struct skyouff *next; struct skyouff *prev; struct netudvice*dev;/このパケットを処理するデバイス unsigned 要点 len,/有効データ長 data_len; __u 16 maccun, hdr len;skyouffaut トランスポート; skyouffaut networkヘッド; skyouffaut mac
/* The e elements must be at the end see alloc skb() for detail. */ skyouffaut tail;/有効データ終了 skyouffaut end; unsigned char *head、//分配空間の開始 *データ開始 unsigned 要点 truesize; トミカル アメリカ;}カーネル対スカイプbuffの操作は分配、釈放、変更などがあります.
(1)分配
カーネル割り当てソケットバッファの関数
struct skbuff*alloc_skyb(unsigned int len,gfput prority)
ソケットバッファとデータバッファを割り当てて、data、tail、headメンバーを初期化します.カーネル・プロトコル・スタックによって割り当てられる.
struct skbuff*dev_alloc_skyb(unsigned int len)
GFP_でATOMIC優先呼び出しalloc_sky割り当て.ドライバからデータ割り当てを受けて使用します.
(2)釈放
void kfree_skyb(struct skyo*skyb);
カーネルプロトコルスタックの呼び出し.
void dev_kfree_skyb(struct skyo*skyb);
ドライバからバッファを解放します.非中断バッファに使用します.
dev_kfree_スカイプirq()は、コンテキストを中断するために使用されます.
(3)変更
unsigned char*skyb_put(struct skyo*skyb、unsigned int len);
skyb-->tail後にlenバイトに移行します.
unsigned char*skyb_push(strut skyo*skyb,unsigned int len)
skyb-->dataはlenバイトを前にシフトします.
netdevice構造体は、1つのデバイスを記述するためのネットワークデバイスインターフェース層にある.定義とinclude/linux/netdevice.h
内部メンバは、ネットワークデバイスの属性記述とインターフェース動作を含む.
部分ソースコード:
struct netdevice {}
/* * This is the first field of the 「visible」 part of this structure * (i.e. as seen by users in the 「Space.c」 file. It is the name * of the interface. */ char name[IFNAMSIZ];…unsigned long memuend /* shared mem end */ unsigned long memustart /* shared mem start */ unsigned long baseudr; /* device I/O address */ unsigned 要点 irq /* device IRQ number */onst struct netvices*netdevuops; const struct netvices*netdevuops /*デバイス操作関数*/…キャラクターデバイスドライバのfileuoperations構造と同様に、インターネットカードによってサポートされる操作が記録されています.
この二つの構造体に対して、彼らの役割は何かを知り、カーネルはいつどのような方法で彼らを操作しますか?
skbuff(ソケットバッファ)は、Linuxネットワークサブシステムの各階層の間でデータを転送するためのネットワークプロトコルインターフェース層に位置し、Linuxネットワークサブシステムのデータ伝達の「中枢神経」である.include/linux/skbuff.hで定義されています.
パケットを送信すると、送信するデータをsk(u)に保存します.buffでは、下層に転送し、対応するプロトコルヘッダを追加してネットワークデバイスに送信する.
パケットを受信すると、sk_にデータを保存したいです.buffでは、上層部に伝達され、上層部は契約ヘッドを剥ぎ、ユーザーに渡すまでになっている.
部分ソースコード:
struct skbuff {}
/* These two memberst. */ struct skyouff *next; struct skyouff *prev; struct netudvice*dev;/このパケットを処理するデバイス unsigned 要点 len,/有効データ長 data_len; __u 16 maccun, hdr len;skyouffaut トランスポート; skyouffaut networkヘッド; skyouffaut mac
/* The e elements must be at the end see alloc skb() for detail. */ skyouffaut tail;/有効データ終了 skyouffaut end; unsigned char *head、//分配空間の開始 *データ開始 unsigned 要点 truesize; トミカル アメリカ;}カーネル対スカイプbuffの操作は分配、釈放、変更などがあります.
(1)分配
カーネル割り当てソケットバッファの関数
struct skbuff*alloc_skyb(unsigned int len,gfput prority)
ソケットバッファとデータバッファを割り当てて、data、tail、headメンバーを初期化します.カーネル・プロトコル・スタックによって割り当てられる.
struct skbuff*dev_alloc_skyb(unsigned int len)
GFP_でATOMIC優先呼び出しalloc_sky割り当て.ドライバからデータ割り当てを受けて使用します.
(2)釈放
void kfree_skyb(struct skyo*skyb);
カーネルプロトコルスタックの呼び出し.
void dev_kfree_skyb(struct skyo*skyb);
ドライバからバッファを解放します.非中断バッファに使用します.
dev_kfree_スカイプirq()は、コンテキストを中断するために使用されます.
(3)変更
unsigned char*skyb_put(struct skyo*skyb、unsigned int len);
skyb-->tail後にlenバイトに移行します.
unsigned char*skyb_push(strut skyo*skyb,unsigned int len)
skyb-->dataはlenバイトを前にシフトします.
netdevice構造体は、1つのデバイスを記述するためのネットワークデバイスインターフェース層にある.定義とinclude/linux/netdevice.h
内部メンバは、ネットワークデバイスの属性記述とインターフェース動作を含む.
部分ソースコード:
struct netdevice {}
/* * This is the first field of the 「visible」 part of this structure * (i.e. as seen by users in the 「Space.c」 file. It is the name * of the interface. */ char name[IFNAMSIZ];…unsigned long memuend /* shared mem end */ unsigned long memustart /* shared mem start */ unsigned long baseudr; /* device I/O address */ unsigned 要点 irq /* device IRQ number */onst struct netvices*netdevuops; const struct netvices*netdevuops /*デバイス操作関数*/…キャラクターデバイスドライバのfileuoperations構造と同様に、インターネットカードによってサポートされる操作が記録されています.
static const struct net_device_opsdm9000_netdev_ops =
{
.ndo_open =dm9000_open,
.ndo_stop =dm9000_stop,
.ndo_start_xmit = dm9000_start_xmit,
.ndo_do_ioctl =dm9000_ioctl,
.ndo_validate_addr= eth_validate_addr,
.ndo_set_mac_address= eth_mac_addr,
};
デバイスの動作関数のオン、オフなどを含め、デバイスドライバに具体的な関数を実装します.