Orion
Barry Importing existing Orion kernel d41a53c (3 years, 1 month ago)
/*
* This file represents the core of the Kernel Networking System. It contains
* the outwards facing interface, as well as the internal interface for the
* lower levels to make use of.
*/
#include <stdint.h>
#include <string.h>
#include "net.h"
#include "../mem/heap.h"
NetIF *netifs;
/* Switch the endian of integers */
static uint16_t
switch_endian16(uint16_t nb)
{
return (nb>>8) | (nb<<8);
}
static uint32_t
switch_endian32(uint32_t nb)
{
return ((nb>>24)&0xff) |
((nb<<8)&0xff0000) |
((nb>>8)&0xff00) |
((nb<<24)&0xff000000);
}
/* Host to Network byte order */
uint16_t
htons(uint16_t hostshort)
{
return switch_endian16(hostshort);
}
uint32_t
htonl(uint32_t hostlong)
{
return switch_endian32(hostlong);
}
/* Network to Host byte order */
uint16_t
ntohs(uint16_t netshort)
{
return switch_endian16(netshort);
}
uint32_t
ntohl(uint32_t netlong)
{
return switch_endian32(netlong);
}
/* Intialise Networking */
void
init_net(void)
{
char ip[] = {10,0,2,2};
memcpy(netifs->gatewayIp, ip, 4);
arp_request(netifs, ip, netifs->gatewayMac);
/* Send ICMP ECHO */
char icmp[12] = {
8, 0,
0xF7, 0xFE,
0x00, 0x01,
0, 0
};
char pip[] = {1,1,1,1};
ipv4_send_packet(netifs, pip, 1, 0, icmp, 12);
}
/* Register a Network Driver */
NetIF *
net_create_interface(uint16_t type, void (*transmit)(void *, size_t),
void (*get_mac)(char *buf))
{
NetIF *netif = kmalloc(sizeof(NetIF));
netif->type = type;
netif->transmit = transmit;
netif->get_mac = get_mac;
netif->get_mac(netif->mac);
netif->ip[0] = 10;
netif->ip[1] = 0;
netif->ip[2] = 2;
netif->ip[3] = 15;
/* Link into list */
netif->next = netifs;
netifs = netif;
}