我想在linux内核中传输一个包含有效tcp和ip头的skb。它应该在没有路由的情况下输出特定的接口。
我的问题是,我不能使用dev_queue_xmit
,因为我不知道目的地的mac-address。
我尝试找出arp_find
的mac地址失败了:
...
mh = (struct ethhdr *) skb_push(skb, sizeof(struct ethhdr));
...
arp_find(mh->h_dest, skb); //this or the next line
val = dev_queue_xmit(skb); //crashes kernel
ip_local_out
的实验也失败了。我设置了ip头信息并调用ip_local_out
,这也导致内核崩溃。
我无法使用ip_queue_xmit
,因为我无法找到struct flowi *fl
字段中提供的数据。
所以我的问题:
备注:
dev_queue_xmit
发送自制的skbs
目标mac地址。所以构建skb的代码不是
问题。答案 0 :(得分:2)
如果您仍想使用ip_local_out
或ip_queue_xmit
,那么您可以像这样创建您的flowinfo。
struct flowi4 fl4 = {
.flowi4_oif = skb->dev->ifindex,
.daddr = iph->daddr,
.saddr = iph->saddr,
};
然后用
创建dst(rtable)ip_route_output_key
使用
设置为skb_buffskb_dst_set
答案 1 :(得分:1)
我认为在内核中使用套接字编程将其作为RAW IP数据包发送是一种更清晰的解决方案。
您可以像这样创建套接字。
sock_create_kern(&sk, AF_INET,
SOCK_RAW, IPPROTO_RAW,
net);
然后打电话
kernel_sendmsg
让你的数据包通过协议栈。