如何在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