1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include "utils/includes.h"
- #include "utils/common.h"
- #include "wlantest.h"
- static int inject_frame(int s, const void *data, size_t len)
- {
- #define IEEE80211_RADIOTAP_F_FRAG 0x08
- unsigned char rtap_hdr[] = {
- 0x00, 0x00,
- 0x0e, 0x00,
- 0x02, 0xc0, 0x00, 0x00,
- IEEE80211_RADIOTAP_F_FRAG,
- 0x00,
- 0x00, 0x00,
- 0x00, 0x00,
- };
- struct iovec iov[2] = {
- {
- .iov_base = &rtap_hdr,
- .iov_len = sizeof(rtap_hdr),
- },
- {
- .iov_base = (void *) data,
- .iov_len = len,
- }
- };
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = iov,
- .msg_iovlen = 2,
- .msg_control = NULL,
- .msg_controllen = 0,
- .msg_flags = 0,
- };
- int ret;
- ret = sendmsg(s, &msg, 0);
- if (ret < 0)
- perror("sendmsg");
- return ret;
- }
- int wlantest_inject(struct wlantest *wt, struct wlantest_bss *bss,
- struct wlantest_sta *sta, u8 *frame, size_t len,
- enum wlantest_inject_protection prot)
- {
- int ret;
- wpa_hexdump(MSG_DEBUG, "Inject frame", frame, len);
- if (wt->monitor_sock < 0) {
- wpa_printf(MSG_INFO, "Cannot inject frames when monitor "
- "interface is not in use");
- return -1;
- }
-
- if (prot != WLANTEST_INJECT_UNPROTECTED)
- return -1;
- ret = inject_frame(wt->monitor_sock, frame, len);
- return (ret < 0) ? -1 : 0;
- }
|