summaryrefslogtreecommitdiff
path: root/src/packet_stream.h
blob: d60af163e4ef647dd53cf1156f2f54ccbf45d591 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#pragma once

#include <al/array.h>

#include "util/packet.h"
#include "socket/socket.h"

#include "loop.h"

struct nn_packet_stream {
    struct nn_event_loop *loop;
    struct nn_socket sock;
    ev_io revent;
    ev_io wevent;
    u8 id; // multiplex
    u8 connect;
    bool corked;
    struct {
        struct nn_packet *packet;
        size_t index;
        bool have_header;
    } in;
    struct {
        array(struct nn_packet *) queue;
        struct nn_packet *packet;
        size_t index;
        bool running;
    } out;
    struct nn_packet_stream *direct;
    bool (*connection_callback)(void *, struct nn_packet_stream *);
    void (*connection_closed_callback)(void *, struct nn_packet_stream *);
    void (*packet_callback)(void *, struct nn_packet_stream *, struct nn_packet *);
    void (*packet_sent_callback)(void *, struct nn_packet *);
    void (*packets_sent_callback)(void *, struct nn_packet **, u32);
    void *userdata;
};

void nn_packet_stream_init(struct nn_packet_stream *stream,
    bool (*connection_callback)(void *, struct nn_packet_stream *),
    void (*connection_closed_callback)(void *, struct nn_packet_stream *), void *userdata);
void nn_packet_stream_set_nodelay(struct nn_packet_stream *stream, s32 no_delay);
void nn_packet_stream_from_socket(struct nn_packet_stream *stream, struct nn_event_loop *loop, struct nn_socket *sock);
void nn_packet_stream_connect(struct nn_packet_stream *stream, struct nn_event_loop *loop,
    u8 id, u8 type, str *addr, u16 port);
void nn_packet_stream_reconnect(struct nn_packet_stream *stream, str *addr, u16 port);
bool nn_packet_stream_set_connected(struct nn_packet_stream *stream);
void nn_packet_stream_cork(struct nn_packet_stream *stream, bool cork);
bool nn_packet_stream_send_packet(struct nn_packet_stream *stream, struct nn_packet *packet);
void nn_packet_stream_discard_queue(struct nn_packet_stream *stream);
void nn_packet_stream_return_packet(struct nn_packet_stream *stream, struct nn_packet *packet);
void nn_packet_stream_return_packets(struct nn_packet_stream *stream, struct nn_packet **packets, u32 count);
void nn_packet_stream_disconnect(struct nn_packet_stream *stream);
void nn_packet_stream_free(struct nn_packet_stream *stream);