OpenCores
URL https://opencores.org/ocsvn/fpga-cf/fpga-cf/trunk

Subversion Repositories fpga-cf

[/] [fpga-cf/] [trunk/] [cpp/] [rawethernet.cpp] - Rev 10

Compare with Previous | Blame | View Log

// rawethernet.cpp
 
#include "rawethernet.hpp"
 
#include <sys/socket.h>
#include <netpacket/packet.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <arpa/inet.h>
 
#include <iostream>
#include <cstring>
 
using namespace std;
 
RawEthernet::RawEthernet()
{
	this->protocol = 0x0800;
}
 
RawEthernet::~RawEthernet()
{
 
}
 
bool RawEthernet::connect(byte addr[])
{
	struct sockaddr_ll socket_address;
	socket_address.sll_family = AF_PACKET;
	socket_address.sll_protocol = 0;//htons(ETH_P_IP); //0
	socket_address.sll_ifindex = if_nametoindex("eth0");
	socket_address.sll_hatype = 0;//ARPHRD_ETHER; //0
	socket_address.sll_pkttype = 0;//PACKET_OTHERHOST; //0
	socket_address.sll_halen = ETH_ALEN;
 
	/*MAC - begin*/
	socket_address.sll_addr[0]  = addr[0];
	socket_address.sll_addr[1]  = addr[1];
	socket_address.sll_addr[2]  = addr[2];
	socket_address.sll_addr[3]  = addr[3];
	socket_address.sll_addr[4]  = addr[4];
	socket_address.sll_addr[5]  = addr[5];
	/*MAC - end*/
	socket_address.sll_addr[6]  = 0x00;/*not used*/
	socket_address.sll_addr[7]  = 0x00;/*not used*/
 
	return this->connect(&socket_address);
}
 
bool RawEthernet::connect(struct sockaddr_ll *socket_address)
{
	this->socketid = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
	if (this->socketid < 0)
	{
		cout << "Socket Error!" << endl;
		perror("socket");
		return false;
	}
	memcpy((void*)&(this->socket_address), socket_address, sizeof(struct sockaddr_ll));
 
	if (bind(this->socketid, (struct sockaddr*)socket_address, sizeof(struct sockaddr_ll))<0)
	{
		cout << "Binding Error!" << endl;
		perror("bind");
		return false;
	}
	return true;
}
 
void RawEthernet::disconnect()
{
 
}
 
bool RawEthernet::sendData(byte data[], int len)
{
	memcpy((void*)this->buffer, (void*)(this->socket_address.sll_addr), ETH_ALEN);
	memcpy((void*)(this->buffer+ETH_ALEN), (void*)(this->src_mac), ETH_ALEN);
	*((short*)&(this->buffer[ETH_ALEN+ETH_ALEN])) = htons(this->protocol);
	memcpy((void*)(this->buffer+ETH_HLEN), (void*)data, len);
	if (len < ETH_DATA_LEN)
	{
		memset((void*)(this->buffer+ETH_HLEN+len), 0, ETH_DATA_LEN-len);
	}
	int send_result = sendto(this->socketid, this->buffer, ETH_FRAME_LEN, 0,
							(struct sockaddr*)&(this->socket_address), sizeof(struct sockaddr_ll));
	if (send_result == -1)
	{
		cout << "Send Errer!" << endl;
		perror("sendto");
		return false;
	}
	return true;
}
 
bool RawEthernet::requestData(int len, byte *data)
{
	int length = recvfrom(this->socketid, this->buffer, ETH_FRAME_LEN, 0, NULL, NULL);
	if (length == -1)
	{
		cout << "Receive Error!" << endl;
		perror("recvfrom");
		return false;
	}
	if (ntohs(*((short*)(&this->buffer[12]))) != this->protocol) return false;
	memcpy((void*)data, (void*)(this->buffer+14), len);
	return true;
}
 
const byte RawEthernet::src_mac[] = {0x0, 0x1b, 0x21, 0x82, 0xaf, 0xad};// len=8
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.