Viewing: socket.h
📄 socket.h (Read Only) ⬅ To go back
#ifndef SOCKET_H
#define SOCKET_H

#include <stdint.h>
#include <stddef.h>

/* Address families */
#define AF_INET     2

/* Socket types */
#define SOCK_STREAM 1   /* TCP */
#define SOCK_DGRAM  2   /* UDP */

/* Protocols */
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17

/* Shutdown how */
#define SHUT_RD     0
#define SHUT_WR     1
#define SHUT_RDWR   2

/* Socket options */
#define SOL_SOCKET      1
#define SO_REUSEADDR    2
#define SO_ERROR        4
#define SO_KEEPALIVE    9

/* sockaddr_in (IPv4) — matches POSIX layout */
struct sockaddr_in {
    uint16_t sin_family;
    uint16_t sin_port;      /* network byte order */
    uint32_t sin_addr;      /* network byte order */
    uint8_t  sin_zero[8];
};

/* Generic sockaddr */
struct sockaddr {
    uint16_t sa_family;
    char     sa_data[14];
};

typedef uint32_t socklen_t;

/* Max kernel sockets */
#define KSOCKET_MAX         16
#define KSOCKET_RX_BUF_SIZE 4096
#define KSOCKET_ACCEPT_MAX  4

/* Kernel socket states */
#define KSOCK_CLOSED      0
#define KSOCK_CREATED     1
#define KSOCK_BOUND       2
#define KSOCK_LISTENING   3
#define KSOCK_CONNECTING  4
#define KSOCK_CONNECTED   5
#define KSOCK_PEER_CLOSED 6

/* Byte order helpers (x86 is little-endian) */
static inline uint16_t htons(uint16_t x) { return (uint16_t)((x >> 8) | (x << 8)); }
static inline uint16_t ntohs(uint16_t x) { return htons(x); }
static inline uint32_t htonl(uint32_t x) {
    return ((x >> 24) & 0xFF) | ((x >> 8) & 0xFF00) |
           ((x << 8) & 0xFF0000) | ((x << 24) & 0xFF000000U);
}
static inline uint32_t ntohl(uint32_t x) { return htonl(x); }

/* Kernel socket API (called from syscall layer) */
int  ksocket_create(int domain, int type, int protocol);
int  ksocket_bind(int sid, const struct sockaddr_in* addr);
int  ksocket_listen(int sid, int backlog);
int  ksocket_accept(int sid, struct sockaddr_in* addr);
int  ksocket_connect(int sid, const struct sockaddr_in* addr);
int  ksocket_send(int sid, const void* buf, size_t len, int flags);
int  ksocket_recv(int sid, void* buf, size_t len, int flags);
int  ksocket_sendto(int sid, const void* buf, size_t len, int flags,
                    const struct sockaddr_in* dest);
int  ksocket_recvfrom(int sid, void* buf, size_t len, int flags,
                      struct sockaddr_in* src);
int  ksocket_close(int sid);
int  ksocket_setsockopt(int sid, int level, int optname, const void* optval, uint32_t optlen);
int  ksocket_getsockopt(int sid, int level, int optname, void* optval, uint32_t* optlen);
int  ksocket_shutdown(int sid, int how);
int  ksocket_getpeername(int sid, struct sockaddr_in* addr);
int  ksocket_getsockname(int sid, struct sockaddr_in* addr);
int  ksocket_poll(int sid, int events);
void ksocket_init(void);

#endif