minor improvements in vm86 code, still random errors occurs
[quarnos.git] / resources / ethernet.cpp
blob626e9ebef0c9a3a0365dc87fa14c4246e96ad086
1 #include "ethernet.h"
3 using namespace resources;
5 struct ethernet2_frame {
6 u32 dst0;
7 u16 dst1;
8 u32 src0;
9 u16 src1;
10 u16 type;
11 } __attribute__((packed));
13 void ethernet::set_nic(p<nic> x) {
14 link_layer::set_nic(x);
16 delegate<void, void*,int> rec;
17 rec.method(this, &ethernet::receive_data);
18 x->set_receiver(rec);
21 void ethernet::send_data(mac_addr addr, u16 prot, void *buff, int size) {
22 void *package = (void*)new char[size + sizeof(ethernet2_frame)];
24 ethernet2_frame *frame = (ethernet2_frame*)package;
26 frame->dst0 = addr.first_be32();
27 frame->dst1 = addr.last_be16();
29 frame->src0 = get_haddr().first_be32();
30 frame->src1 = get_haddr().last_be16();
32 frame->type = to_be16(prot);
34 memcpy((void*)&frame[1], buff, size);
36 hardware->send_data(package, size + sizeof(ethernet2_frame));
39 void ethernet::receive_data(void *buffer, int size) {
40 ethernet2_frame *frm = (ethernet2_frame*)buffer;
41 mac_addr addr = mac_addr::from_be(frm->dst0, frm->dst1);
42 mac_addr broadcast = mac_addr::from_be(0xffffffff, 0xffff);
44 if (get_haddr() != addr && addr != broadcast)
45 return;
47 int type = from_be16(frm->type);
49 for (int i = 0; i < type_id.get_count(); i++)
50 if (type_id[i] == type)
51 handlers[i](&frm[1], size - sizeof(ethernet2_frame));