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

Subversion Repositories fpga-cf

[/] [fpga-cf/] [trunk/] [cpp/] [rawethernet.cpp] - Blame information for rev 10

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 peteralieb
// rawethernet.cpp
2
 
3
#include "rawethernet.hpp"
4
 
5
#include <sys/socket.h>
6
#include <netpacket/packet.h>
7
#include <net/ethernet.h>
8
#include <net/if.h>
9
#include <arpa/inet.h>
10
 
11
#include <iostream>
12
#include <cstring>
13
 
14
using namespace std;
15
 
16
RawEthernet::RawEthernet()
17
{
18
        this->protocol = 0x0800;
19
}
20
 
21
RawEthernet::~RawEthernet()
22
{
23
 
24
}
25
 
26
bool RawEthernet::connect(byte addr[])
27
{
28
        struct sockaddr_ll socket_address;
29
        socket_address.sll_family = AF_PACKET;
30
        socket_address.sll_protocol = 0;//htons(ETH_P_IP); //0
31
        socket_address.sll_ifindex = if_nametoindex("eth0");
32
        socket_address.sll_hatype = 0;//ARPHRD_ETHER; //0
33
        socket_address.sll_pkttype = 0;//PACKET_OTHERHOST; //0
34
        socket_address.sll_halen = ETH_ALEN;
35
 
36
        /*MAC - begin*/
37
        socket_address.sll_addr[0]  = addr[0];
38
        socket_address.sll_addr[1]  = addr[1];
39
        socket_address.sll_addr[2]  = addr[2];
40
        socket_address.sll_addr[3]  = addr[3];
41
        socket_address.sll_addr[4]  = addr[4];
42
        socket_address.sll_addr[5]  = addr[5];
43
        /*MAC - end*/
44
        socket_address.sll_addr[6]  = 0x00;/*not used*/
45
        socket_address.sll_addr[7]  = 0x00;/*not used*/
46
 
47
        return this->connect(&socket_address);
48
}
49
 
50
bool RawEthernet::connect(struct sockaddr_ll *socket_address)
51
{
52
        this->socketid = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
53
        if (this->socketid < 0)
54
        {
55
                cout << "Socket Error!" << endl;
56
                perror("socket");
57
                return false;
58
        }
59
        memcpy((void*)&(this->socket_address), socket_address, sizeof(struct sockaddr_ll));
60
 
61
        if (bind(this->socketid, (struct sockaddr*)socket_address, sizeof(struct sockaddr_ll))<0)
62
        {
63
                cout << "Binding Error!" << endl;
64
                perror("bind");
65
                return false;
66
        }
67
        return true;
68
}
69
 
70
void RawEthernet::disconnect()
71
{
72
 
73
}
74
 
75
bool RawEthernet::sendData(byte data[], int len)
76
{
77
        memcpy((void*)this->buffer, (void*)(this->socket_address.sll_addr), ETH_ALEN);
78
        memcpy((void*)(this->buffer+ETH_ALEN), (void*)(this->src_mac), ETH_ALEN);
79
        *((short*)&(this->buffer[ETH_ALEN+ETH_ALEN])) = htons(this->protocol);
80
        memcpy((void*)(this->buffer+ETH_HLEN), (void*)data, len);
81
        if (len < ETH_DATA_LEN)
82
        {
83
                memset((void*)(this->buffer+ETH_HLEN+len), 0, ETH_DATA_LEN-len);
84
        }
85
        int send_result = sendto(this->socketid, this->buffer, ETH_FRAME_LEN, 0,
86
                                                        (struct sockaddr*)&(this->socket_address), sizeof(struct sockaddr_ll));
87
        if (send_result == -1)
88
        {
89
                cout << "Send Errer!" << endl;
90
                perror("sendto");
91
                return false;
92
        }
93
        return true;
94
}
95
 
96
bool RawEthernet::requestData(int len, byte *data)
97
{
98
        int length = recvfrom(this->socketid, this->buffer, ETH_FRAME_LEN, 0, NULL, NULL);
99
        if (length == -1)
100
        {
101
                cout << "Receive Error!" << endl;
102
                perror("recvfrom");
103
                return false;
104
        }
105
        if (ntohs(*((short*)(&this->buffer[12]))) != this->protocol) return false;
106
        memcpy((void*)data, (void*)(this->buffer+14), len);
107
        return true;
108
}
109
 
110
const byte RawEthernet::src_mac[] = {0x0, 0x1b, 0x21, 0x82, 0xaf, 0xad};// len=8

powered by: WebSVN 2.1.0

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