Orion
Barry Importing existing Orion kernel d41a53c (2 years, 4 months 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; }