独自のパケット (App、UDP、IP) を作成write()
し、それを TUN デバイスに送信するユーザー空間プログラムがあります。パケットは私自身の Netfilter モジュールによって傍受され、受信したパケットが処理したいものであるかどうかをチェックします。次に、Netfilter モジュールがskb_clone()
元skb
の応答パケットを作成し、ユーザー空間プログラムに返されるデータを入力します。応答を送信するには、 を使用しますdev_queue_xmit()
。NET_XMIT_CN
新しい TUN デバイスを作成したばかりで、他のトラフィックが通過していないにもかかわらず、ランダムに返されます。ユーザー空間プログラムを実行し続ける (TUN デバイスに新しいパケットを送信する) と、最終的に TUN デバイスは応答しますが、一貫性はありません。なぜそんなに不規則に動作しているのかを追跡できないようです。
基本的に、ユーザー空間からカーネル空間へ、またはその逆に通信するためのメカニズムとして TUN デバイスを使用しています。
これが私のユーザー空間アプリです:
tun_fd = tun_alloc(dev_name);
packet = ... /* Construct request...*/
nwrite = write(tun_fd, packet, packet_len);
...
unsigned recv_buf[1500];
int received = 0;
while (!received) {
nread = read(tun_fd, recv_buf, 1500);
...
}
...
close(tun_fd);
ここに私の Netfilter モジュールがあります:
static struct nf_hook_ops nfho;
static int __init my_hook(void)
{
nfho.hook = hook_func;
nfho.hooknum = 0;
nfho.hook = PF_INET;
nfho.hook = NF_IP_PRI_FIRST;
nf_register_hook(&nfho);
}
unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
struct sk_buff *clone_skb = skb_clone(skb, GFP_KERNEL):
...
/*
* Check if packet is for us.
* Check IP & UDP header, etc
* If so, parse request, put together response clone_skb
*/
...
if ((err = dev_queue_xmit(clone_skb)) != 0) {
printk(....)
/* Either it return 0 (success) or 2, meaning NET_XMIT_CN */
}
return NF_STOLEN;
}
私はこの行動を理解できないようです。TUN デバイスを誤用していませんか? これより簡単な方法はありますか?
追加の詳細を提供する必要がある場合、または何かを明確にする必要がある場合はお知らせください。