how to change the src mac address of the packet at l2_packet_linux.c
d' Ani
anirbande
Wed Apr 8 21:52:59 PDT 2009
Hi all
Setup: PC1-------AP-----------STA----------PC2
eth0 br0 br0 eth0
eth0+ath0 eth0+ath0
Invocation: wpa_supplicant -Dmadwifi -iath0 -bbr0 -c/etc/wpa_cupplicant.conf
Background: I wanted to achieve association with AP with a mac address of PC2 not with STA, thus rendering STA invisible to the AP. Things working fine till here. Can ping all nodes adding ebtables and iptables rules.
Goal: Want to run WPA-PSK/WPA2-PSK for the authentication AP----STA. hostap/wpa_supplicant should be running on AP/STA (wpa_supplicant not to run on PC2 although STA has associated with PC2 mac).
Problem: Now 4 way handshake fails to happen. As the wpa_supplicant sends 2 out of 4 message it sends it with own mac and i guess the hostapd rejects it as it associated with PC2 mac. i am using l2_packet_linux.c for layer two send.
What i have done: modified the l2_packet send as follows. As well as i have enabled the l2->l2_hdr = 1 to include layer 2 header in l2_packet_init (my changes in blue)
Question: Am i correct in my implementation. i can't still get the handshake going. Hostapd -dd shows
eth0: <PC2 MAC> WPA: sending 1/4 msg of 4 way handshake
eth0: <PC2 MAC> EAPOL-Key timeout
int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto,
const u8 *buf, size_t len)
{
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int ret;
struct l2_ethhdr *eth;
uint8_t src[ETH_ALEN] = {0x00, 0x13, 0x20, 0x5b, 0x40, 0xaa};// PC2 addr
size_t mlen = sizeof(*eth) + len;
eth = os_malloc(mlen);
if (!eth) return -1;
os_memset(ð, 0, sizeof(eth));
os_memcpy(eth->h_dest, dst_addr, ETH_ALEN);
os_memcpy(eth->h_source, src, ETH_ALEN);
eth->h_proto = host_to_be16(proto);
os_memcpy(eth + 1, buf, len);
ret = send(l2->fd, buf, mlen, 0);
if (ret < 0) perror("l2_packet_send - error pramod ");
return ret;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#if 0
int ret;
if (l2 == NULL)
return -1;
if (l2->l2_hdr) {
ret = send(l2->fd, buf, len, 0);
wpa_printf(MSG_DEBUG, "pramod sending using send l2->l2_hdr=%d", l2->l2_hdr);
if (ret < 0)
perror("l2_packet_send - send 55");
} else {
struct sockaddr_ll ll;
os_memset(&ll, 0, sizeof(ll));
ll.sll_family = AF_PACKET;
ll.sll_ifindex = l2->ifindex;
ll.sll_protocol = htons(proto);
ll.sll_halen = ETH_ALEN;
os_memcpy(ll.sll_addr, dst_addr, ETH_ALEN);
ret = sendto(l2->fd, buf, len, 0, (struct sockaddr *) &ll,
sizeof(ll));
wpa_printf(MSG_DEBUG, "pramod sending using sendto l2->l2_hdr=%d", l2->l2_hdr);
if (ret < 0)
perror("l2_packet_send - sendto");
}
return ret;
#endif
}
Finally: if i am filling src dest proto of the ETH header is linux going to fill the CRC checksum? Is the is another way to implement this easily so that i can send the packets on the socket using my changed SRC mac address.
Regards,
Anirban De
Yahoo: anirbande
Skype: anirbande
Gtalk : ade.sxc
Add more friends to your messenger and enjoy! Go to http://messenger.yahoo.com/invite/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.shmoo.com/pipermail/hostap/attachments/20090408/f2c058de/attachment-0001.htm
More information about the Hostap
mailing list