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構造と同様に、インターネットカードによってサポートされる操作が記録されています.
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,
};
デバイスの動作関数のオン、オフなどを含め、デバイスドライバに具体的な関数を実装します.