我正在尝试在C中构建和发送802.11帧。我看到可以用pcap来实现它。但是,在我看到的所有例子中,我必须设置自己的序列号和其他控制字段。所以我想知道是否有一个API允许管理所有这个控制部分,我只需要指定地址?
提前谢谢你,
答案 0 :(得分:0)
首先,您要尝试制作什么类型的数据包?数据帧或信标帧.....
如果您是从头开始创建,则需要自己设置所有参数,我正在使用此头文件 [ieee80211] http://lxr.free-electrons.com/source/include/linux/ieee80211.h 对于802.11配置参数和radiotap标头,您可以使用 [radiotap] http://lxr.free-electrons.com/source/include/net/ieee80211_radiotap.h
我可以给你一个创建信标帧的示例代码(部分)
// Add the radiotap header
radiotap->it_version = 0;
radiotap->it_len = sizeof(*radiotap) + sizeof(dataRate);
radiotap->it_present = (1 << IEEE80211_RADIOTAP_RATE);
// Beacon packet flags
dot80211->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_BEACON;
dot80211->i_fc[1] = IEEE80211_FC1_DIR_NODS;
dot80211->i_dur[0] = 0x0;
dot80211->i_dur[1] = 0x0;
// Destination = broadcast (no retries)
memcpy( dot80211->i_addr1, mac_Destination, IEEE80211_ADDR_LEN );
// Source = our own mac address
memcpy( dot80211->i_addr2, mac_source, IEEE80211_ADDR_LEN );
// BSS = our mac address
memcpy( dot80211->i_addr3, mac_BSSID, IEEE80211_ADDR_LEN );
// Sequence control: Automatically set by the driver
beacon -> beacon_timestamp = TimeStamp;
printf("%"PRIu64,beacon -> beacon_timestamp);
// interval = 100 "time units" = 102.4 ms
// Each time unit is equal to 1024 us
beacon->beacon_interval = BEACON_INTERVAL;
// capabilities = sent by ESS
//beacon->beacon_capabilities = x0003;
例如:
dot80211->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_BEACON;
您可以像这样设置FCS(帧控制),它在标题中定义。
我的建议是创建自己的头文件或根据需要进行修改..
希望这有帮助??