|
|
@ -170,61 +170,61 @@ Ethernet_getInterfaceMACAddress(const char* interfaceId, uint8_t* addr)
|
|
|
|
EthernetSocket
|
|
|
|
EthernetSocket
|
|
|
|
Ethernet_createSocket(const char* interfaceId, uint8_t* destAddress)
|
|
|
|
Ethernet_createSocket(const char* interfaceId, uint8_t* destAddress)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
EthernetSocket ethernetSocket = GLOBAL_CALLOC(1, sizeof(struct sEthernetSocket));
|
|
|
|
EthernetSocket self = GLOBAL_CALLOC(1, sizeof(struct sEthernetSocket));
|
|
|
|
|
|
|
|
|
|
|
|
if (ethernetSocket)
|
|
|
|
if (self)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ethernetSocket->rawSocket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
|
|
|
|
self->rawSocket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
|
|
|
|
|
|
|
|
|
|
|
|
if (ethernetSocket->rawSocket == -1)
|
|
|
|
if (self->rawSocket == -1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
printf("Error creating raw socket!\n");
|
|
|
|
printf("Error creating raw socket!\n");
|
|
|
|
GLOBAL_FREEMEM(ethernetSocket);
|
|
|
|
GLOBAL_FREEMEM(self);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ethernetSocket->socketAddress.sll_family = PF_PACKET;
|
|
|
|
self->socketAddress.sll_family = PF_PACKET;
|
|
|
|
ethernetSocket->socketAddress.sll_protocol = htons(ETH_P_ALL);
|
|
|
|
self->socketAddress.sll_protocol = htons(ETH_P_ALL);
|
|
|
|
|
|
|
|
|
|
|
|
int ifcIdx = getInterfaceIndex(ethernetSocket->rawSocket, interfaceId);
|
|
|
|
int ifcIdx = getInterfaceIndex(self->rawSocket, interfaceId);
|
|
|
|
|
|
|
|
|
|
|
|
if (ifcIdx == -1)
|
|
|
|
if (ifcIdx == -1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Ethernet_destroySocket(ethernetSocket);
|
|
|
|
Ethernet_destroySocket(self);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ethernetSocket->socketAddress.sll_ifindex = ifcIdx;
|
|
|
|
self->socketAddress.sll_ifindex = ifcIdx;
|
|
|
|
|
|
|
|
|
|
|
|
ethernetSocket->socketAddress.sll_hatype = ARPHRD_ETHER;
|
|
|
|
self->socketAddress.sll_hatype = ARPHRD_ETHER;
|
|
|
|
ethernetSocket->socketAddress.sll_pkttype = PACKET_HOST | PACKET_MULTICAST;
|
|
|
|
self->socketAddress.sll_pkttype = PACKET_HOST | PACKET_MULTICAST;
|
|
|
|
|
|
|
|
|
|
|
|
ethernetSocket->socketAddress.sll_halen = ETH_ALEN;
|
|
|
|
self->socketAddress.sll_halen = ETH_ALEN;
|
|
|
|
|
|
|
|
|
|
|
|
memset(ethernetSocket->socketAddress.sll_addr, 0, 8);
|
|
|
|
memset(self->socketAddress.sll_addr, 0, 8);
|
|
|
|
|
|
|
|
|
|
|
|
if (destAddress != NULL)
|
|
|
|
if (destAddress != NULL)
|
|
|
|
memcpy(ethernetSocket->socketAddress.sll_addr, destAddress, 6);
|
|
|
|
memcpy(self->socketAddress.sll_addr, destAddress, 6);
|
|
|
|
|
|
|
|
|
|
|
|
ethernetSocket->isBind = false;
|
|
|
|
self->isBind = false;
|
|
|
|
|
|
|
|
|
|
|
|
Ethernet_setMode(ethernetSocket, ETHERNET_SOCKET_MODE_PROMISC);
|
|
|
|
Ethernet_setMode(self, ETHERNET_SOCKET_MODE_PROMISC);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ethernetSocket;
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
Ethernet_setMode(EthernetSocket ethSocket, EthernetSocketMode mode)
|
|
|
|
Ethernet_setMode(EthernetSocket self, EthernetSocketMode mode)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (ethSocket)
|
|
|
|
if (self)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (mode == ETHERNET_SOCKET_MODE_PROMISC)
|
|
|
|
if (mode == ETHERNET_SOCKET_MODE_PROMISC)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct ifreq ifr;
|
|
|
|
struct ifreq ifr;
|
|
|
|
|
|
|
|
|
|
|
|
if (ioctl (ethSocket->rawSocket, SIOCGIFFLAGS, &ifr) == -1)
|
|
|
|
if (ioctl (self->rawSocket, SIOCGIFFLAGS, &ifr) == -1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
printf("ETHERNET_LINUX: Problem getting device flags");
|
|
|
|
printf("ETHERNET_LINUX: Problem getting device flags");
|
|
|
@ -232,7 +232,7 @@ Ethernet_setMode(EthernetSocket ethSocket, EthernetSocketMode mode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ifr.ifr_flags |= IFF_PROMISC;
|
|
|
|
ifr.ifr_flags |= IFF_PROMISC;
|
|
|
|
if (ioctl (ethSocket->rawSocket, SIOCSIFFLAGS, &ifr) == -1)
|
|
|
|
if (ioctl (self->rawSocket, SIOCSIFFLAGS, &ifr) == -1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
printf("ETHERNET_LINUX: Setting device to promiscuous mode failed");
|
|
|
|
printf("ETHERNET_LINUX: Setting device to promiscuous mode failed");
|
|
|
@ -243,7 +243,7 @@ Ethernet_setMode(EthernetSocket ethSocket, EthernetSocketMode mode)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct ifreq ifr;
|
|
|
|
struct ifreq ifr;
|
|
|
|
|
|
|
|
|
|
|
|
if (ioctl (ethSocket->rawSocket, SIOCGIFFLAGS, &ifr) == -1)
|
|
|
|
if (ioctl (self->rawSocket, SIOCGIFFLAGS, &ifr) == -1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
printf("ETHERNET_LINUX: Problem getting device flags");
|
|
|
|
printf("ETHERNET_LINUX: Problem getting device flags");
|
|
|
@ -251,7 +251,7 @@ Ethernet_setMode(EthernetSocket ethSocket, EthernetSocketMode mode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ifr.ifr_flags |= IFF_ALLMULTI;
|
|
|
|
ifr.ifr_flags |= IFF_ALLMULTI;
|
|
|
|
if (ioctl (ethSocket->rawSocket, SIOCSIFFLAGS, &ifr) == -1)
|
|
|
|
if (ioctl (self->rawSocket, SIOCSIFFLAGS, &ifr) == -1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
printf("ETHERNET_LINUX: Setting device to promiscuous mode failed");
|
|
|
|
printf("ETHERNET_LINUX: Setting device to promiscuous mode failed");
|
|
|
@ -260,22 +260,22 @@ Ethernet_setMode(EthernetSocket ethSocket, EthernetSocketMode mode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (mode == ETHERNET_SOCKET_MODE_HOST_ONLY)
|
|
|
|
else if (mode == ETHERNET_SOCKET_MODE_HOST_ONLY)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ethSocket->socketAddress.sll_pkttype = PACKET_HOST;
|
|
|
|
self->socketAddress.sll_pkttype = PACKET_HOST;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (mode == ETHERNET_SOCKET_MODE_MULTICAST)
|
|
|
|
else if (mode == ETHERNET_SOCKET_MODE_MULTICAST)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ethSocket->socketAddress.sll_pkttype = PACKET_HOST | PACKET_MULTICAST;
|
|
|
|
self->socketAddress.sll_pkttype = PACKET_HOST | PACKET_MULTICAST;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
Ethernet_addMulticastAddress(EthernetSocket ethSocket, uint8_t* multicastAddress)
|
|
|
|
Ethernet_addMulticastAddress(EthernetSocket self, uint8_t* multicastAddress)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct packet_mreq mreq;
|
|
|
|
struct packet_mreq mreq;
|
|
|
|
memset(&mreq, 0, sizeof(struct packet_mreq));
|
|
|
|
memset(&mreq, 0, sizeof(struct packet_mreq));
|
|
|
|
|
|
|
|
|
|
|
|
mreq.mr_ifindex = ethSocket->socketAddress.sll_ifindex;
|
|
|
|
mreq.mr_ifindex = self->socketAddress.sll_ifindex;
|
|
|
|
mreq.mr_alen = ETH_ALEN;
|
|
|
|
mreq.mr_alen = ETH_ALEN;
|
|
|
|
mreq.mr_type = PACKET_MR_MULTICAST;
|
|
|
|
mreq.mr_type = PACKET_MR_MULTICAST;
|
|
|
|
mreq.mr_address[0] = multicastAddress[0];
|
|
|
|
mreq.mr_address[0] = multicastAddress[0];
|
|
|
@ -285,7 +285,7 @@ Ethernet_addMulticastAddress(EthernetSocket ethSocket, uint8_t* multicastAddress
|
|
|
|
mreq.mr_address[4] = multicastAddress[4];
|
|
|
|
mreq.mr_address[4] = multicastAddress[4];
|
|
|
|
mreq.mr_address[5] = multicastAddress[5];
|
|
|
|
mreq.mr_address[5] = multicastAddress[5];
|
|
|
|
|
|
|
|
|
|
|
|
int res = setsockopt(ethSocket->rawSocket, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
|
|
|
|
int res = setsockopt(self->rawSocket, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
|
|
|
|
|
|
|
|
|
|
|
|
if (res != 0)
|
|
|
|
if (res != 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -295,7 +295,7 @@ Ethernet_addMulticastAddress(EthernetSocket ethSocket, uint8_t* multicastAddress
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
Ethernet_setProtocolFilter(EthernetSocket ethSocket, uint16_t etherType)
|
|
|
|
Ethernet_setProtocolFilter(EthernetSocket self, uint16_t etherType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (etherType == 0x88b8)
|
|
|
|
if (etherType == 0x88b8)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -313,13 +313,13 @@ Ethernet_setProtocolFilter(EthernetSocket ethSocket, uint16_t etherType)
|
|
|
|
fprog.len = sizeof(filter) / sizeof(*filter);
|
|
|
|
fprog.len = sizeof(filter) / sizeof(*filter);
|
|
|
|
fprog.filter = filter;
|
|
|
|
fprog.filter = filter;
|
|
|
|
|
|
|
|
|
|
|
|
if (setsockopt(ethSocket->rawSocket, SOL_SOCKET, SO_ATTACH_FILTER, &fprog, sizeof(fprog)) == -1)
|
|
|
|
if (setsockopt(self->rawSocket, SOL_SOCKET, SO_ATTACH_FILTER, &fprog, sizeof(fprog)) == -1)
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
if (DEBUG_SOCKET)
|
|
|
|
printf("ETHERNET_LINUX: Applying filter failed");
|
|
|
|
printf("ETHERNET_LINUX: Applying filter failed");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ethSocket->socketAddress.sll_protocol = htons(etherType);
|
|
|
|
self->socketAddress.sll_protocol = htons(etherType);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -339,17 +339,20 @@ Ethernet_receivePacket(EthernetSocket self, uint8_t* buffer, int bufferSize)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
Ethernet_sendPacket(EthernetSocket ethSocket, uint8_t* buffer, int packetSize)
|
|
|
|
Ethernet_sendPacket(EthernetSocket self, uint8_t* buffer, int packetSize)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
sendto(ethSocket->rawSocket, buffer, packetSize,
|
|
|
|
sendto(self->rawSocket, buffer, packetSize,
|
|
|
|
0, (struct sockaddr*) &(ethSocket->socketAddress), sizeof(ethSocket->socketAddress));
|
|
|
|
0, (struct sockaddr*) &(self->socketAddress), sizeof(self->socketAddress));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
Ethernet_destroySocket(EthernetSocket ethSocket)
|
|
|
|
Ethernet_destroySocket(EthernetSocket self)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (self)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
close(ethSocket->rawSocket);
|
|
|
|
close(self->rawSocket);
|
|
|
|
GLOBAL_FREEMEM(ethSocket);
|
|
|
|
GLOBAL_FREEMEM(self);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
bool
|
|
|
|