libnl概要

以下の3つのライブラリは、そのコアライブラリのlibnlに基づいています。
libnl-ルート:ルーティングとでインタラクティブカーネルのためのサブシステム。
libnl-NF:との相互作用Netfilterのカーネル用のサブシステム。
libnl-GENL:ジェネリックするNetlinkと対話モジュールのカーネル。 
 
このセクションでは、一般的なlibnl APIのいくつかを説明しています。また、読者が文書にその公式サイトと呼ばれる詳細、アドレス http://www.infradead.org/~tgr/libnl/doc/api/group__cb.html
1つの構造
  libnlオブジェクト指向の方法のネットリンクは、元のAPIを再パッケージ化。
(1)ネットリンクメッセージのメッセージ構造 
構造体nl_msg {
        int型nm_protocol;
        int型nm_flags;
        構造体sockaddr_nl nm_src。
        構造体sockaddr_nl nm_dst。
        ucred nm_credsをストラクト。
        構造体のnlmsghdr * nm_nlh。
        size_tのnm_size;
        int型nm_refcnt;
}。
 
(2)ネットリンクソケット構造
    特定のファイルディスクリプタと構造体structのnl_sockに代表される、関連する属性を備えたネットリンクソケット
構造体nl_sock {
   構造体sockaddr_nl s_local。
   構造体sockaddr_nl s_peer。
   intがs_fd。
   int型s_proto;
   unsigned int型のs_seq_next。
   unsigned int型のs_seq_expect。
   int型s_flags;
   構造体nl_cb * s_cb。
}。
       1)使用前に最初に割り当てnl_sock必要があります:
           構造体nl_sock * nl_socket_alloc(無効); //新しいネットリンクソケットを割り当てるには、新たに割り当てられたか、NULLアドレスnl_sockを返します。
           構造体nl_sock * nl_socket_alloc_cb(構造体nl_cb * CB); //新しいコールバックnl_cb与えられた分注nl_sockは、新しく割り当てられたか、NULLアドレスnl_sockを返します。
       2)使用後にリリースされます。
           空nl_socket_free(構造体nl_sock * SK)。
       3)接続:
           INT nl_connect(構造体nl_sock * SK、INTプロトコル); // nl_connetネットリンクソケットとによるバインドバインド機能に対応するプロトコル・モジュール:
       4)を閉じます:
           空nl_close(構造体nl_sock * SK)。
       5)送信:
           int型nl_sendto(構造体nl_sock * SK、void *型のbufは、size_tのサイズ); //送信データバッファnl_sockへ
           int型nl_sendmsg(構造体nl_sock * SK、構造体nl_msg * MSG、構造体のmsghdr * HDR); //送信データが指定nl_msgのmsghdr
           int型nl_send(構造体nl_sock * SK、構造体nl_msg * MSG)。
 
(3)コールバックハンドラ
 メッセージがソケットで受信されたときに、各メッセージはまた、linbl nl_sock処理コールバック関数を提供してもよいし、コールバック関数が処理されます。そして、コールバックパラメータは、構造体structのnl_cbにカプセル化
構造体nl_cb {
   nl_recvmsg_msg_cb_t cb_set [NL_CB_TYPE_MAX + 1]。
   void *型cb_args [NL_CB_TYPE_MAX + 1];
   nl_recvmsg_err_cb_t cb_err;
   void *型cb_err_arg。
 
   / ** nl_recvmsgsに、すべての内部呼び出しで独自の実装でnl_recvmsgsを置き換えるために使用することができます。* /
  int型(* cb_recvmsgs_ow)(構造体nl_sock *、構造体nl_cb *)。
 
   nl_recvへ/ **上書き内部コール、オクテットの数は読んで、受信データのバッファを割り当てて返す必要があります。* /
  int型(* cb_recv_ow)(構造体nl_sock *、構造体sockaddr_nl *、unsigned char型**、構造体は、** ucred)。
 
   / **上書き内部コールはnl_sendに、ネットリンクメッセージを送信する必要があります。* /
  int型(* cb_send_ow)(構造体nl_sock *、構造体nl_msg *)。
  int型cb_refcnt;
}。
コールバックを設定します。void nl_socket_set_cb(構造体nl_sock * SK、構造体nl_cb * CB)を、
コールバック関数を提供nl_sock情報を取得する:構造体nl_cb * nl_socket_get_cb(CONST構造体nl_sock * SK)。
 
機密nl_cbを分割するには、libnlライブラリ関数
/ *
  1)コールバック関数の戻り値は、次のものが含まれます。
列挙nl_cb_action {
  NL_OKは、//通常のを表しています。
  NL_SKIPは、//ネットリンクメッセージは、受信されたネットリンクメッセージ(ケースのメッセージ断片化)の分析で次のバッファに入れ、現在の解析を停止示します。
  NL_STOP、//手段は、受信時にメッセージ解析バッファを停止します。
}。
 
 
 2)メッセージ・コールバック関数の型:
列挙nl_cb_kind {
  NL_CB_DEFAULT、//デフォルトのコールバックハンドラ
  NL_CB_VERBOSE、//デフォルトのハンドラは、エラーメッセージを出力します
  NL_CB_DEBUG、//デバッグハンドラ
  NL_CB_CUSTOM、//カスタムハンドラ
  __NL_CB_KIND_MAX
}。
 
 
3)タイプtype
NetLinkの根底にあるメッセージを処理する場合、異なるそれを使用することができます。例えば、ネットリンク無効なメッセージは、処理のために設けられたコールバック関数NL_CB_INVALIDEを受信したとき。
列挙nl_cb_type {
  NL_CB_VALID、//有効なメッセージ
  NL_CB_FINISH、//マルチパートメッセージの終わり
  NL_CB_OVERRUN、//データの損失レポート
  NL_CB_SKIPPED、//プロセスメッセージをスキップ
  NL_CB_ACK、//確認メッセージ
  NL_CB_MSG_IN、//受信したすべてのメッセージは、
  NL_CB_MSG_OUT、//すべてのメッセージがnl_sendto()外を除いて、送信されました
  NL_CB_INVALID、//無効なメッセージ
  NL_CB_SEQ_CHECK、  
  NL_CB_SEND_ACK、
  NL_CB_DUMP_INTR、
  __NL_CB_TYPE_MAX
}。
書式#include <ネットリンク/ handlers.h> //このヘッダファイルをインクルードする必要があります
1)初期化
  構造体nl_cb * nl_cb_alloc(列挙nl_cb_kind一種); //は新しいnl_cb、リターンNULLアドレスまたは新しいnl_cbを割り当てます
  構造体nl_cb * nl_cb_clone(構造体nl_cb * ORIG); //コピー新しいnl_cb与えnl_cb
2)設定
   int型nl_cb_set(構造体nl_cb * CB、列挙nl_cb_typeタイプ、列挙型nl_cb_kind種類、nl_recvmsg_msg_cb_t FUNC、void *型のarg); //设置给定kind_type的コールバック
   int型nl_cb_err(構造体nl_cb * CB、列挙型nl_cb_kind種類、nl_recvmsg_err_cb_t FUNC、void *型引数を); //エラーコールバックを設定します
3)コールバックの所与nl_sockを変更します:
   int型nl_socket_modify_cb(構造体nl_sock * SK、列挙nl_cb_typeタイプ、列挙型nl_cb_kind種類、nl_recvmsg_msg_cb_t FUNC、void *型のarg); //
 
 
 メッセージ2 libnlの処理
libnlは、独自のメッセージ構造の構造体nl_msgを定義します。しかし、それはまた、ネットリンクメッセージを直接扱うためのAPIを提供します。次のように一般的にAPIを使用していました。
書式#include <ネットリンク/ msg.h> //このヘッダファイルをインクルードする必要があります
メッセージ本体に相当する部分の//計算長ネットリンク
INT nlmsg_size(INT payloadlen); //は、これら2つの関数の図の意義を参照することによって理解される値を返します
int型nlmsg_total_size(int型payloadlen)。
 
その他のAPIは、直接、次のようにネットリンクメッセージが処理することができます。
構造体のnlmsghdr * NLMSG_NEXT(構造体のnlmsghdr * HDR、INT *残り)。
int型nlmsg_ok(残りのconst構造体のnlmsghdr * HDR、INT);
/ *に等しい、マクロを処理するためのメッセージループを定義
nlmsg_ok(POS、REM);(int型REM = LEN、POS =ヘッドの\
      POS = NLMSG_NEXT(POS、およびREM))
* /
#define nlmsg_for_each(POS、頭部、EN)   
 
開発者は、定義されたメッセージ構造nl_msgのlibnlによって関連する動作を実行することができる、及び関連するAPIのnl_msgは以下の通りです。
構造体nl_msg * nlmsg_alloc(無効)。
空nlmsg_free(構造体nl_msg * MSG)。
// nl_msg確かに、内部ポイントメッセージヘッダネットリンクの例には、次の関数は、ヘッダネットリンクを埋めるために使用されます
構造体のnlmsghdr * nlmsg_put(構造体nl_msg * MSG、のuint32_tポート、のuint32_t seqnr、int型nlmsg_type、int型のペイロード、int型nlmsg_flags)。
 
(3)メッセージ送受信libnl
ネットリンクを直接システムコール(例えば、送信、RECV、sendmsgの、recvmsgのなど)、データを送受信し、独自のパッケージlibnlデータ送受信APIへ。主変速機と関連するAPIは以下のいくつか。
//送信メッセージを直接ネットリンク
int型nl_sendto(構造体nl_sock * SK、void *型のbufは、size_tのサイズ)
 
//メッセージnl_msgを送ります
int型nl_send(構造体nl_sock * SK、構造体nl_msg * MSG)
int型nl_send_simple(構造体nl_sock * SK、int型、int型のフラグ、無効* bufは、size_tのサイズ);
 
共通のデータAPIを受信すると、次の。
//コア受信機能。送信側のアドレス情報を記憶するパラメータNLA。に関連する情報を格納するための許可をcredsを
int型nl_recv(構造体nl_sock * SK、構造体sockaddr_nl * NLA、unsigned char型** bufに、構造体は、** credsをしucred)
//内部nl_recvを介してメッセージを受信し、その後、コールバックの受信機構造CBコールバック関数を通過
int型nl_recvmsgs(構造体nl_sock * SK、構造体nl_cb * CB)
 
(4)libnl-GENL APIの紹介
  libnl-GENLはlibnlに基づいている一般的なネットリンク処理モジュールを、カプセル化します。一般的なネットリンク少し上のLinux命令は、あなたがlibnlの説明を参照してくださいことを示唆しています。
ここで、genlmsghdr次のプロトタイプ。
構造体genlmsghdr {
 __u8 CMD; // CMDおよびバージョンとは、特定の例に関連しています
 __u8バージョン。
 __u16は予約; //を禁じます。
}。
 
次のように一般的に使用されるAPIをGENL。
//とnl_connect型libnl、のみプロトコルタイプGENERIC_NETLINK
int型genl_connect(構造体nl_sock * SK)
 
図のnlmsghdr、genlmsghderおよびユーザー定義を充填するための// genlmsg_putメッセージヘッダ。詳細については、以下を参照してください
void *型genlmsg_put(構造体nl_msg * MSG、のuint32_tポート、のuint32_t配列、int型の家族、int型hdrlen、int型のフラグ、uint8_t CMD、uint8_tバージョン)
 
// nlattrメッセージ内容GENLに運ば取得するために使用
構造体nlattr * genlmsg_attrdata(constの構造体genlmsghdr * gnlh、int型hdrlen)   
 
また、いくつかのより重要なGENLのAPI、それらに関連するカーネル実装のメカニズムとGENL、唯一のいくつかの簡単な内容があります。GENLメカニズムを達成するために、カーネルは、仮想ジェネリックするNetlinkバスを作成します。(カーネルモジュールまたはユーザ空間のプロセスを含む)GENLすべてのユーザーが、これはバスに登録されます。これらのユーザー登録は、我々はgenl_familyと呼ばれるデータ構造を移入する必要があり、この構造は、アイデンティティマークです。だから、長い家族をgenlmsg_putパラメータを設定する当事者として、データが対応するモジュールに転送することができます。
 
家族は整数であり、可読性が悪い、ユーザは、多くの場合、家族の名前などの文字列を指定しGENLます。家族GENL名と別の重要なプロセスへのモジュールの家族によって対応関係。このモジュールは、それはまた、一般的なバスのユーザーである、GENLコントローラです。そのファミリー名「nlctrl」であり、それの家族が固定され、(一般NETLINK_GENERICマクロとして定義される)16の電流値。コントローラの重要な役割は、家族の名前、動的に他の家族の登録者数を割り当てられている他の登録者のための家族との関係を確立することです。また、コントローラは、戻り値のファミリ名と現在で登録されたすべてのGENLカーネルモジュールの家族そのクエリをサポートしています。
 
ユーザ空間プログラム限り、家族が値を知って、通信モジュールを指定することができます。libnl-GENLは、上記の動作をカプセル化し、いくつかの共通APIを提供します。
@クエリ文字列の家族への家族の名前は、内部実装の意志機能はコントローラにクエリメッセージを送信します
  int型genl_ctrl_resolve(構造体nl_sock * SK、CONST文字*名)
 
/ *
  コントローラの番号に問い合わせを作るためにすべての家族が真剣に効率に影響を与える場合は、libnl-GENLは、キャッシュされた情報を照会します。
  次の関数はnl_cacheリスト、現在ジェネリックするNetlinkバスのすべての登録者に登録されたコンテンツ格納されている情報を割り当てます。
* /
int型genl_ctrl_alloc_cache(構造体nl_sock * SK、構造体nl_cache **結果)
 
//姓に応じてキャッシュに対応するgenl_family情報を取得します
* genl_familyストラクトgenl_ctrl_search_by_name(構造体nl_cache *キャッシュ、CONST文字*名)
 
ヒント物事は直接でもlibnlパッケージであれば、開発者へのlibnlよりやさしいネットリンクAPI、、、ネットリンクプログラミングはかすかな心のためにまだないがどのように関係なく、を比較しました。これまでのところ、私はドキュメントが完全にプロトコルと対応がnetlinkマルチキャストグループに記述することができます発見していない、それはサポートされているコマンドのコントローラモジュール不可欠な知識GENLです。Windowsプラットフォームでは、ドキュメントのMicrosoftのプログラミング、開発を行うために今年は、説明の原則だけでなく、の開発者は、プログラミングのスキルが多い提供します。これらのコンテンツの開発者は、貴重です。しかし、私たちは、サプリメントの文書は、間違いなく素晴らしいことですが、Linuxは修正を期待しています。これで私は、学習過程における情報の収集にその読者の注意をだけを望むことができると一緒に共有すること。

おすすめ

転載: www.cnblogs.com/hshy/p/12079866.html