#ifndef KERNEL_MOD_NET_H
#define KERNEL_MOD_NET_H

typedef uint8_t* (*get_mac_func)(void);
typedef struct ethernet_packet* (*get_packet_func)(void);
typedef void (*send_packet_func)(uint8_t*, size_t);

struct netif {
	void *extra;

	get_mac_func get_mac;
	get_packet_func get_packet;
	send_packet_func send_packet;

	uint8_t hwaddr[6];
	uint32_t source;

	char * driver;

	uint32_t gateway;
};

extern void init_netif_funcs(get_mac_func mac_func, get_packet_func get_func, send_packet_func send_func, char * device);
extern void net_handler(void * data, char * name);
extern size_t write_dhcp_packet(uint8_t * buffer);

extern struct socket* net_open(uint32_t type);
extern int net_send(struct socket* socket, uint8_t* payload, size_t payload_size, int flags);
extern size_t net_recv(struct socket* socket, uint8_t* buffer, size_t len);
extern int net_connect(struct socket* socket, uint32_t dest_ip, uint16_t dest_port);
extern int net_close(struct socket* socket);
#endif
