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