如何在Linux中创建Ethernet II
帧头?可以使用eth_header()
创建802.3帧头,给出skbuffer
以及源和目标MAC和长度。同样的函数是否也可以用于Ethernet II
帧格式,我们使用类型字段而不是长度?
答案 0 :(得分:2)
(当前)内核源以下列方式定义相关方法:
int eth_header(struct sk_buff *skb, struct net_device *dev,
unsigned short type,
const void *daddr, const void *saddr, unsigned len);
所以我们做有一个type
字段。到目前为止一切都很好。
让我们看一下方法的实现,是否以及如何考虑type
的值。该方法如下所示:
{
struct ethhdr *eth = ...
if (type != ETH_P_802_3 && type != ETH_P_802_2)
eth->h_proto = htons(type);
else
eth->h_proto = htons(len);
...
正如我们所看到的,除了802.2 / 3之外的所有类型的 type
(传递给函数)的值用于初始化帧头,这是我们想要的以太网II帧头。
结论并回答问题:是,可以使用eth_header()
创建以太网II帧头。
答案 1 :(得分:0)
比照。 net/ipv6/netfilter/ip6t_REJECT.c
和net/ethernet/eth.c
。:
nskb = skb_alloc(...);
...
struct ethhdr *eh = skb_push(nskb, sizeof(struct ethhdr));
eh->h_proto = htons(ETH_P_IPV6);
您可以根据要添加到数据包的内容来更改分配和/或推送的字节数。