3 using namespace resources
;
5 struct ethernet2_frame
{
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, ðernet::receive_data
);
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
)
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
));