有没有办法告诉数据包使用哪种MAC头?

时间:2014-02-27 21:30:07

标签: networking linux-kernel network-protocols 802.11

有没有办法通过查看数据包本身(标头)或使用系统中的某个接口来检查数据包在内核中的MAC头(即802.11或802.2)是什么类型的?

2 个答案:

答案 0 :(得分:1)

内核收到MAC头,所以在内核中,是的,有一种方法可以查看MAC头。

在用户空间中,它更复杂。您不会将IP数据包的MAC头传递给普通的TCP连接套接字(例如)。但是,您可以使用(例如)ebtablesiptables来处理连接。从那里你可以标记连接(使用--connmark),你可以找到与libconntrack或类似的适当连接,并读取标记。您可以使用此技术来区分两类mac标头。

所以如何实现这一点取决于你想做什么。

答案 1 :(得分:0)

在Linux内核v3.6.1中,include/linux/ieee80211.h似乎有一个函数可以检测以太网帧是否为IEEE802.11类型。

你去了:

/**
 * ieee80211_is_data_present - check if type is IEEE80211_FTYPE_DATA and has data
 * @fc: frame control bytes in little-endian byteorder
 */
static inline int ieee80211_is_data_present(__le16 fc)
{
        /*
         * mask with 0x40 and test that that bit is clear to only return true
         * for the data-containing substypes.
         */
        return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
               cpu_to_le16(IEEE80211_FTYPE_DATA);
}