如何在Linux中创建Ethernet II
帧头?可以使用eth_header()
创建802.3帧头,给出skbuffer
以及源和目标MAC和长度。 Ethernet II
帧格式也可以使用相同的函数,我们使用类型字段而不是长度吗?创建以太网II帧头?
1
A
回答
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帧头。
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);
你可以改变分配的字节数量和/或根据您要添加到该数据包是什么推动。
相关问题
- 1. 如何确定以太网II帧的长度?
- 2. 巨型以太网帧和超大型帧的标头
- 3. 以太网帧传输
- 4. 解析以太网帧
- 5. 在Windows上发送原始以太网II帧时,我必须提供FCS吗?
- 6. 关于以太网帧的标头大小的困惑
- 7. 所有以太网帧是否包含LLC头?
- 8. 识别帧,以太网或IEEE 802.3?
- 9. 从UDP端口接收以太网帧
- 10. 来自NIC的以太网帧
- 11. 以太网端点,帧和触发器
- 12. 如何传输以太网帧?
- 13. 小于64字节的以太网帧
- 14. 大型以太网帧(超大型)?
- 15. 创建Ldap Plug ii Grails 2.3
- 16. 以太网头是什么样的?
- 17. 什么是可以发送的以太网帧样本?
- 18. 在Wireshark中为非以太网数据创建Lua解析器
- 19. 用ns-3创建两个无线网络和一个以太网网络
- 20. 解析以太网帧和数据类型
- 21. 确定添加到以太网帧的填充量
- 22. Python在Windows上使用套接字读取以太网帧?
- 23. 最小的TCP/IP开销(通过以太网帧)
- 24. 在以太网帧中设置CoS(PCP,802.1P)
- 25. 在Objective-C接收原始的以太网帧
- 26. 如何接收无效的以太网帧?
- 27. 反编组以太网帧和数据对齐
- 28. Linux中以太网帧的低级别要求
- 29. 提高巨型帧的以太网吞吐量
- 30. Linux:在发送以太网帧时,ethertype正在被重写
感谢您的回复。举例来说,我有一个类型字段为8100(vlan tagging),所以当我调用这个函数时,我应该通过ETH_P_802_2来输入字段,并且将8100输入到len字段。那是否正确? – user1023527 2012-01-02 06:28:36
@ user1023527:Actullay这可以工作(至少使用当前源) - 但我建议通过'ETH_P_8021Q'(通过'/ usr/src/linux/include/linux/if_ether.h') 'type'并通过'len'传递任何东西('0')。 – alk 2012-01-02 07:54:27
@ user1023527:*“VLAN tagging *”为802.1Q('ETH_P_8021Q'),'ETH_P_8021Q'又定义为'#define'为'8100'。 – alk 2012-01-04 07:54:12