Adding select support for basic socket udp receive.
[akaros.git] / kern / include / socket.h
1 #ifndef ROS_SOCKET_H
2 #define ROS_SOCKET_H
3
4 #include <ros/common.h>
5 #include <sys/queue.h>
6 #include <atomic.h>
7 #include <net/pbuf.h>
8 #include <kthread.h>
9 #include <vfs.h>
10 // Just a couple of AF types that we might support
11 #define AF_UNSPEC       0
12 #define AF_UNIX         1       /* Unix domain sockets          */
13 #define AF_LOCAL        1       /* POSIX name for AF_UNIX       */
14 #define AF_INET         2       /* Internet IP Protocol         */
15
16 #define PF_UNSPEC       AF_UNSPEC
17 #define PF_UNIX         AF_UNIX
18 #define PF_LOCAL        AF_LOCAL
19 #define PF_INET         AF_INET
20
21 #define SS_NOFDREF              0x0001  /* no file table ref any more */
22 #define SS_ISCONNECTED          0x0002  /* socket connected to a peer */
23 #define SS_ISCONNECTING         0x0004  /* in process of connecting to peer */
24 #define SS_ISDISCONNECTING      0x0008  /* in process of disconnecting */
25 #define SS_NBIO                 0x0100  /* non-blocking ops */
26 #define SS_ASYNC                0x0200  /* async i/o notify */
27 #define SS_ISCONFIRMING         0x0400  /* deciding to accept connection req */
28 #define SS_ISDISCONNECTED       0x2000  /* socket disconnected from peer */
29
30 /* Define an range for automatic port assignment */
31 #define SOCKET_PORT_START 4096
32 #define SOCKET_PORT_END  0x7fff
33
34 struct socket;
35 struct proc;
36 // These are probably defined elsewhere too..
37 #ifndef socklen_t
38 typedef int socklen_t;
39 typedef int sa_family_t;
40 #endif
41 #define inet_addr_to_ipaddr_p(target_ipaddr_p, source_inaddr)   ((target_ipaddr_p) = (ip_addr_t*)&((source_inaddr)->s_addr))
42 enum sock_type {
43     SOCK_STREAM = 1,
44     SOCK_DGRAM  = 2,
45     SOCK_RAW    = 3,
46     SOCK_RDM    = 4,
47     SOCK_SEQPACKET  = 5,
48     SOCK_DCCP   = 6,
49     SOCK_PACKET = 10,
50 };
51
52 struct socket{
53   //int so_count;       /* (b) reference count */
54   short   so_type;        /* (a) generic type, see socket.h */
55         short   so_family;
56         int     so_protocol;
57   short   so_options;     /* from socket call, see socket.h */
58   //short   so_linger;      /* time to linger while closing */
59   short   so_state;       /* (b) internal state flags SS_* */
60         //int so_qstate;      /* (e) internal state flags SQ_* */
61         void    *so_pcb;        /* protocol control block */
62         struct pbuf_head recv_buff;
63         struct pbuf_head send_buff;
64         struct semaphore sem;
65         spinlock_t waiter_lock;
66         struct semaphore_list waiters;   /* semaphone to for a process to sleep on */
67         
68         //struct  vnet *so_vnet;      /* network stack instance */
69         //struct  protosw *so_proto;  /* (a) protocol handle */
70 };
71
72 struct in_addr {
73     uint32_t s_addr;
74 };
75
76 /* members are in network byte order */
77 struct sockaddr_in {
78     // uint8_t sin_len; -- bsd only field
79     uint8_t sin_family;
80     uint16_t sin_port;
81     struct in_addr sin_addr;
82     char sin_zero[8];
83 };
84
85
86 struct sockaddr {
87         unsigned char   sa_len;         /* bsd only total length */
88         sa_family_t     sa_family;      /* address family */
89         char            sa_data[14];    /* actually longer; address value */
90 };
91
92 /*
93  * Message header for recvmsg and sendmsg calls.
94  * Used value-result for recvmsg, value only for sendmsg.
95  */ 
96 struct msghdr {
97     void        *msg_name;      /* optional address */
98     socklen_t    msg_namelen;       /* size of address */
99     struct iovec    *msg_iov;       /* scatter/gather array */
100     int      msg_iovlen;        /* # elements in msg_iov */
101     void        *msg_control;       /* ancillary data, see below */
102     socklen_t    msg_controllen;    /* ancillary data buffer len */
103     int      msg_flags;     /* flags on received message */
104 };
105
106
107
108 extern struct kmem_cache *sock_kcache;
109 extern struct kmem_cache *mbuf_kcache;
110 extern struct kmem_cache *udp_pcb_kcache;
111
112 void socket_init();
113 intreg_t send_iov(struct socket* sock, struct iovec* iov, int flags);
114 int send_datagram(struct socket* sock, struct iovec* iov, int flags);
115
116 intreg_t sys_socket(struct proc *p, int socket_family, int socket_type, int protocol);
117 intreg_t sys_sendto(struct proc *p, int socket, const void *buffer, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len);
118 intreg_t sys_recvfrom(struct proc *p, int socket, void *restrict buffer, size_t length, int flags, struct sockaddr *restrict address, socklen_t *restrict address_len);
119 intreg_t sys_select(struct proc *p, int nfds, fd_set *readfds, fd_set *writefds,
120                                 fd_set *exceptfds, struct timeval *timeout);
121
122
123 #endif /* ROS_SOCKET_H */
124