Max OS 0.3
Loading...
Searching...
No Matches
ethernetframe.cpp
Go to the documentation of this file.
1
9#include <net/ethernetframe.h>
10
11using namespace MaxOS;
12using namespace MaxOS::common;
13using namespace MaxOS::net;
14using namespace MaxOS::drivers;
15using namespace MaxOS::drivers::ethernet;
16using namespace MaxOS::memory;
17
25
26 this->handled_type = handled_type;
27 this->frame_handler = frame_handler;
29
30
31}
32
38
39
49
50 //By default, don't handle it, will be handled in the override
51 return false;
52
53}
54
63
64 frame_handler->send_ethernet_frame(destination, handled_type, data, size);
65}
66
75
76 this->ethernet_driver = driver;
77 this->error_messages = error_messages;
78
79 driver->connect_event_handler(this);
80
81}
82
83EthernetFrameHandler::~EthernetFrameHandler() = default;
84
93
94
105
106 error_messages->write("EFH: Data received\n");
107
108
109 //Check if the size is big enough to contain an ethernet frame
110 if(size < sizeof(EthernetFrameHeader))
111 return false;
112
113 //Convert to struct for easier use
114 auto* frame = (EthernetFrameHeader*) buffer;
115 bool send_back = false;
116
117 //Only handle if it is for this device
118 if(frame->destination_mac == 0xFFFFFFFFFFFF //If it is a broadcast
119 || frame->destination_mac == ethernet_driver->get_media_access_control_address()) //If it is for this device
120 {
121
122 // Find the handler for the protocol
124
125 // If the handler is found
126 if(handler_iterator != frame_handlers.end()) {
127
128 //Handle the data
129 error_messages->write("EFH: Handling ethernet frame payload\n");
130 send_back = handler_iterator->second->handle_ethernetframe_payload(buffer + sizeof(EthernetFrameHeader),
131 size - sizeof(EthernetFrameHeader));
132 error_messages->write("..DONE\n");
133
134 } else {
135
136 //If the handler is not found, print an error message
137 error_messages->write("EFH: Unhandled ethernet frame type 0x");
139 error_messages->write("\n");
140
141 }
142 }
143
144 //If the data is to be sent back again
145 if(send_back) {
146
147 error_messages->write("EFH: Sending back\n");
148
149 frame->destination_mac = frame->source_mac; //Set the new destination to be the device the data was received from
150 frame->source_mac = ethernet_driver->get_media_access_control_address(); //Set the new source to be this device's MAC address
151
152 }
153
154 //Return if the data is to be sent back
155 return send_back;
156
157}
158
165
166 // Convert the protocol type to big endian
167 uint16_t frame_type_be = ((handler->handled_type >> 8) & 0xFF) | ((handler->handled_type << 8) & 0xFF00);
168
169 // Add the handler to the list
171
172}
173
183
184 error_messages->write("EFH: Sending frame...");
185
186 //Allocate memory for the buffer
187 auto* buffer = (uint8_t*) MemoryManager::kmalloc(size + sizeof(EthernetFrameHeader));
188 auto* frame = (EthernetFrameHeader*) buffer;
189
190 //Put data in the header
191 frame->destination_mac = destination_mac;
193 frame->type = (frame_type >> 8) | (frame_type << 8); //Convert to big endian
194
195 //Copy the data
196 for(uint8_t* src = data + size - 1, * dst = buffer + sizeof(EthernetFrameHeader) + size - 1; src >= data; --src, --dst)
197 *dst = *src;
198
199 //Send the data
200 ethernet_driver->send(buffer, size + sizeof(EthernetFrameHeader));
201
202 error_messages->write("Done\n");
203
204
205 //Free the buffer
206 MemoryManager::kfree(buffer);
207}
A stream that strings can be written to.
virtual void write_hex(uint64_t hex_to_write)
Writes a hex to the output stream.
void write(string string_to_write) override
Writes a string to the output stream.
Stores the left, top, width and height of a rectangle.
Definition rectangle.h:22
Handles the events that are triggered by the Ethernet Driver.
Definition ethernet.h:73
Driver for the Ethernet Controller, manages the sending and receiving of data, the mac address,...
Definition ethernet.h:89
virtual MediaAccessControlAddress get_media_access_control_address()
Get the MAC address.
Definition ethernet.cpp:89
void send(uint8_t *buffer, uint32_t size)
send data to the network via the driver backend
Definition ethernet.cpp:99
static void * kmalloc(size_t size)
Allocates a block of memory in the KERNEL space.
static void kfree(void *pointer)
Frees a block of memory using the kernel memory manager.
Handles incoming Ethernet Frames and routes them to the appropriate payload handlers.
void send_ethernet_frame(uint64_t destination_mac, uint16_t frame_type, uint8_t *data, uint32_t size)
send an packet via the backend driver
void connect_handler(EthernetFramePayloadHandler *handler)
connect a handler to the frame handler
EthernetFrameHandler(drivers::ethernet::EthernetDriver *driver, common::OutputStream *error_messages)
Construct a new Ether Frame Handler object.
drivers::ethernet::MediaAccessControlAddress get_mac()
Get the MAC address of this device.
common::Map< uint16_t, EthernetFramePayloadHandler * > frame_handlers
The map of frame handlers by type.
bool data_received(uint8_t *data, uint32_t size) override
Handle the received packet.
drivers::ethernet::EthernetDriver * ethernet_driver
The driver this frame handler is using.
common::OutputStream * error_messages
The output stream for error messages.
Handles a specific type of Ethernet Frame payload.
~EthernetFramePayloadHandler()
Destroy the EtherFrameHandler:: EtherFrameHandler object, Removes it from the handler list.
void send(uint64_t destination, uint8_t *data, uint32_t size)
send an packet via the backend driver
EthernetFramePayloadHandler(EthernetFrameHandler *frame_handler, uint16_t handled_type)
Construct a new Ether Frame Payload Handler object.
uint16_t handled_type
The Ethernet frame type this handler handles.
virtual bool handle_ethernetframe_payload(uint8_t *ethernetframe_payload, uint32_t size)
Handle the received ethernet frame payload.
EthernetFrameHandler * frame_handler
The Ethernet frame handler this payload handler is connected to.
Defines classes for handling Ethernet Frames and their payloads.
Structure the raw data. This is the header of an Ethernet Frame.