Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 4 additions & 11 deletions kernel/networking/drivers/net_driver.hpp
Original file line number Diff line number Diff line change
@@ -1,28 +1,21 @@
#pragma once

#include "types.h"
#include "std/string.h"
#include "ui/graphic_types.h"
#include "net/network_types.h"
#include "net/network_types.h"

class NetDriver {
public:
NetDriver(){}
NetDriver() = default;
virtual bool init() = 0;

virtual sizedptr allocate_packet(size_t size) = 0;

virtual sizedptr handle_receive_packet(void* buffer) = 0;

virtual void handle_sent_packet() = 0;

virtual void enable_verbose() = 0;

virtual void send_packet(sizedptr packet) = 0;

virtual void get_mac(network_connection_ctx *context) = 0;
virtual void get_mac(net_l2l3_endpoint *context) = 0;

virtual ~NetDriver() = default;

uint16_t header_size;
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ bool VirtioNetDriver::init(){
}


void VirtioNetDriver::get_mac(network_connection_ctx *context){
void VirtioNetDriver::get_mac(net_l2l3_endpoint *context){
virtio_net_config* net_config = (virtio_net_config*)vnp_net_dev.device_cfg;
kprintfv("[VIRTIO_NET] %x:%x:%x:%x:%x:%x", net_config->mac[0], net_config->mac[1], net_config->mac[2], net_config->mac[3], net_config->mac[4], net_config->mac[5]);

Expand Down
3 changes: 2 additions & 1 deletion kernel/networking/drivers/virtio_net_pci/virtio_net_pci.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@ class VirtioNetDriver : public NetDriver {
sizedptr allocate_packet(size_t size) override;

sizedptr handle_receive_packet(void* buffer) override;

void handle_sent_packet() override;

void enable_verbose() override;

void send_packet(sizedptr packet) override;

void get_mac(network_connection_ctx *context) override;
void get_mac(net_l2l3_endpoint *context) override;

~VirtioNetDriver() = default;

Expand Down
53 changes: 24 additions & 29 deletions kernel/networking/network.cpp
Original file line number Diff line number Diff line change
@@ -1,52 +1,47 @@
#include "network.h"
#include "network_dispatch.hpp"
#include "std/allocator.hpp"
#include "process/scheduler.h"

NetworkDispatch *dispatch;
static NetworkDispatch *dispatch = nullptr;

bool network_init(){
extern "C" bool network_init() {
dispatch = new NetworkDispatch();
return dispatch->init();
return dispatch && dispatch->init();
}

void network_handle_download_interrupt(){
return dispatch->handle_download_interrupt();
extern "C" void network_handle_download_interrupt() {
if (dispatch) dispatch->handle_download_interrupt();
}

void network_handle_upload_interrupt(){
return dispatch->handle_upload_interrupt();
extern "C" void network_handle_upload_interrupt() {
if (dispatch) dispatch->handle_upload_interrupt();
}


bool network_bind_port(uint16_t port, uint16_t process){
return dispatch->bind_port(port, process);
}

bool network_unbind_port(uint16_t port, uint16_t process){
return dispatch->unbind_port(port, process);
extern "C" void network_net_task_entry() {
if (dispatch) dispatch->net_task();
}

bool network_bind_port_current(uint16_t port){
return dispatch->bind_port(port, get_current_proc_pid());
extern "C" int net_tx_frame(uintptr_t frame_ptr, uint32_t frame_len) {
if (!dispatch || !frame_ptr || !frame_len) return -1;
return dispatch->enqueue_frame({frame_ptr, frame_len}) ? 0 : -1;
}

bool network_unbind_port_current(uint16_t port){
return dispatch->unbind_port(port, get_current_proc_pid());
extern "C" int net_rx_frame(sizedptr *out_frame) {
extern uint16_t get_current_proc_pid();
if (!dispatch || !out_frame) return -1;
int sz = dispatch->dequeue_packet_for(get_current_proc_pid(), out_frame) ? (int)out_frame->size : 0;
return sz;
}

void network_send_packet(NetProtocol protocol, uint16_t port, network_connection_ctx *destination, void* payload, uint16_t payload_len){
return dispatch->send_packet(protocol, port, destination, payload, payload_len);
extern "C" const net_l2l3_endpoint* network_get_local_endpoint() {
static net_l2l3_endpoint dummy = {0};
return dispatch ? &dispatch->get_local_ep() : &dummy;
}

bool network_read_packet(sizedptr *packet, uint16_t process){
return dispatch->read_packet(packet, process);
extern "C" void network_net_set_pid(uint16_t pid) {
if (dispatch) dispatch->set_net_pid(pid);
}

bool network_read_packet_current(sizedptr *packet){
return dispatch->read_packet(packet, get_current_proc_pid());
extern "C" uint16_t network_net_get_pid() {
return dispatch ? dispatch->get_net_pid() : UINT16_MAX;
}

network_connection_ctx* network_get_context(){
return dispatch->get_context();
}
22 changes: 10 additions & 12 deletions kernel/networking/network.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,23 @@ extern "C" {
#include "net/network_types.h"

#define NET_IRQ 32

//TODO: review this number
//TODO: consider using the system MTU here
#define MAX_PACKET_SIZE 0x1000

void network_net_set_pid(uint16_t pid);
uint16_t network_net_get_pid();

bool network_init();
void network_handle_download_interrupt();
void network_handle_upload_interrupt();
bool network_bind_port(uint16_t port, uint16_t process);
bool network_unbind_port(uint16_t port, uint16_t process);
void network_send_packet(NetProtocol protocol, uint16_t port, network_connection_ctx *destination, void* payload, uint16_t payload_len);
void network_net_task_entry();

bool network_bind_port_current(uint16_t port);
bool network_unbind_port_current(uint16_t port);
int net_tx_frame(uintptr_t frame_ptr, uint32_t frame_len);
int net_rx_frame(sizedptr *out_frame);

bool network_read_packet(sizedptr *packet, uint16_t process);
bool network_read_packet_current(sizedptr *packet);

network_connection_ctx* network_get_context();
const net_l2l3_endpoint* network_get_local_endpoint();
void network_update_local_ip(uint32_t ip);

#ifdef __cplusplus
}
#endif
#endif
Loading