]> git.sesse.net Git - pistorm/blob - a314/a314device/sockets.h
Add A314 emulation
[pistorm] / a314 / a314device / sockets.h
1 #include <exec/types.h>
2 #include <exec/lists.h>
3
4 // Used to store received data until application asks for it using a A314_READ.
5 struct QueuedData
6 {
7         struct QueuedData *next;
8         UWORD length;
9         UBYTE data[];
10 };
11
12 // Socket flags, these are bit masks, can have many of them.
13 #define SOCKET_RCVD_EOS_FROM_APP        0x0004
14 #define SOCKET_RCVD_EOS_FROM_RPI        0x0008
15 #define SOCKET_SENT_EOS_TO_APP          0x0010
16 #define SOCKET_SENT_EOS_TO_RPI          0x0020
17 #define SOCKET_CLOSED                   0x0040
18 #define SOCKET_SHOULD_SEND_RESET        0x0080
19 #define SOCKET_IN_SEND_QUEUE            0x0100
20
21 struct Socket
22 {
23         struct MinNode node;
24
25         void *sig_task;
26         ULONG socket;
27
28         UBYTE stream_id;
29         UBYTE pad1;
30
31         UWORD flags;
32
33         struct A314_IORequest *pending_connect;
34         struct A314_IORequest *pending_read;
35         struct A314_IORequest *pending_write;
36
37         struct Socket *next_in_send_queue;
38         UWORD send_queue_required_length;
39
40         // Data that is received on the stream, but the application didn't read yet.
41         struct QueuedData *rq_head;
42         struct QueuedData *rq_tail;
43 };
44
45 extern struct Socket *send_queue_head;
46 extern struct Socket *send_queue_tail;
47
48 extern void init_sockets();
49
50 extern struct Socket *create_socket(struct Task *task, ULONG id);
51 extern void delete_socket(struct Socket *s);
52
53 extern struct Socket *find_socket(void *sig_task, ULONG socket);
54 extern struct Socket *find_socket_by_stream_id(UBYTE stream_id);
55
56 extern void add_to_send_queue(struct Socket *s, UWORD required_length);
57 extern void remove_from_send_queue(struct Socket *s);