Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "ethernet_layer_factory.hh"
#include "loggers.hh"
ethernet_layer::ethernet_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params() {
loggers::get_instance().log(">>> ethernet_layer::ethernet_layer: %s, %s", to_string().c_str(), param.c_str());
// Setup parameters
params::convert(_params, param);
params::const_iterator it = _params.find("mac_src");
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("mac_src"), "000000000000"));
}
it = _params.find("mac_bc");
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("mac_bc"), "FFFFFFFFFFFF"));
}
it = _params.find("eth_type");
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("eth_type"), "8947"));
}
//_params.log();
}
void ethernet_layer::send_data(OCTETSTRING& data, params& params) {
loggers::get_instance().log_msg(">>> ethernet_layer::send_data: ", data);
OCTETSTRING eth;
// Destination MAC address
params::const_iterator it = params.find(params::mac_dst); // Find in provided parameters, params
if (it != params.cend()) {
eth = str2oct(CHARSTRING(it->second.c_str()));
} else {
it = _params.find(params::mac_dst);
if (it != _params.cend()) {
eth = str2oct(CHARSTRING(it->second.c_str()));
} else {
eth = str2oct(CHARSTRING(_params[params::mac_bc].c_str()));
}
}
// Source MAC address
it = params.find(params::mac_src); // Find in provided parameters, params
if (it != params.cend()) {
eth += str2oct(CHARSTRING(it->second.c_str()));
} else {
eth += str2oct(CHARSTRING(_params[params::mac_src].c_str()));
}
// Ethernet type
it = params.find(params::eth_type); // Find in layer parameters
if (it != params.cend()) {
eth += str2oct(CHARSTRING(it->second.c_str()));
} else {
eth += str2oct(CHARSTRING(_params[params::eth_type].c_str()));
}
eth += data;
send_to_all_layers(eth, params);
}
void ethernet_layer::receive_data(OCTETSTRING& data, params& params) {
loggers::get_instance().log_msg(">>> ethernet_layer::receive_data: ", data);
// Extract dest MAC Address
OCTETSTRING dst = OCTETSTRING(6, static_cast<const unsigned char *>(data));
//loggers::get_instance().log_msg("ethernet_layer::receive_data: dst: ", dst);
// Extract source MAC Address
OCTETSTRING src = OCTETSTRING(6, 6 + static_cast<const unsigned char *>(data));
//loggers::get_instance().log_msg("ethernet_layer::receive_data: src: ", src);
// Extract ethertype
OCTETSTRING proto = OCTETSTRING(2, 2 + static_cast<const unsigned char *>(data));
//loggers::get_instance().log_msg("ethernet_layer::receive_data: proto: ", proto);
data = OCTETSTRING(data.lengthof() - 14, 14 + static_cast<const unsigned char *>(data));
// Update params
CHARSTRING s = oct2str(dst);
params.insert(std::pair<std::string, std::string>(params::mac_dst, std::string(static_cast<const char *>(s))));
s = oct2str(src);
params.insert(std::pair<std::string, std::string>(params::mac_src, std::string(static_cast<const char *>(s))));
//loggers::get_instance().log_msg("ethernet_layer::receive_data: payload for upper layer:", data);
receive_to_all_layers(data, params);
}
ethernet_layer_factory ethernet_layer_factory::_f;