struct skbuff
転送トラフィック (ブリッジ転送と IP 転送) とローカルで発信されたトラフィックを区別するための情報はありますか? 転送トラフィックはパケット サイズ全体でキャッシュの無効化を必要としないため、これら 2 種類のトラフィックをネットワーク ドライバーで別々に処理する必要があります。
任意の提案をいただければ幸いです。どうもありがとうございました!
struct skbuff
転送トラフィック (ブリッジ転送と IP 転送) とローカルで発信されたトラフィックを区別するための情報はありますか? 転送トラフィックはパケット サイズ全体でキャッシュの無効化を必要としないため、これら 2 種類のトラフィックをネットワーク ドライバーで別々に処理する必要があります。
任意の提案をいただければ幸いです。どうもありがとうございました!
はい、可能です。この関数からのすべての呼び出しを調べることで、受信パケットのライフ サイクルをたどることができます ip_rcv_finish
( http://lxr.free-electrons.com/source/net/ipv4/ip_input.c?v=3.3 #L317 )。
構造体struct sk_buff
には、宛先エントリへのポインタが含まれています。
struct dst_entry *dst;
関数ポインタを含む:
int (*input)(struct sk_buff*);
入力パケットを呼び出すには、ローカル パケットの場合はカーネル コールip_local_deliver
関数を、転送パケットの場合はip_forward
関数を呼び出します。
ローカルおよび転送されたパケットについて、次のように確認できると思います。
- ローカル :
/* struct sk_buff *skb : Entry packet */
if (((struct rtable *)skb->dst)->rt_type == RTN_LOCAL)
{
/* This packet is to consume locally */
}
- 前方 :
if (((struct rtable *)skb->dst)->rt_type == RTN_UNICAST)
{
/* This packet will be forwarded */
}