all repos — circe-vpn @ 111047a8c5cbec3275b7ac76c83c2d93581f8668

Circe VPN

core/core.h (view raw)

 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
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
#ifndef CIRCE_CORE_H
#define CIRCE_CORE_H

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

enum circe_result
{
  CIRCE_RESULT_SUCCESS = 0,
  CIRCE_RESULT_INSUFFICIENT_MEM,
  CIRCE_RESULT_INVALID_PACKET,
  CIRCE_RESULT_INVALID_MAC,
  CIRCE_RESULT_INTERNAL_ERROR,
};

enum circe_version
{
  CIRCE_VERSION_V1 = 0,
};

struct circe_event
{
  enum
  {
    CIRCE_EVENT_DATA_RECEIVED,
    CIRCE_EVENT_NEW_REMOTE,
    CIRCE_EVENT_REJECTED_REMOTE,
  } event_type;
};

enum circe_deadline
{
  CIRCE_DEADLINE_NOW,
  CIRCE_DEADLINE_INDEFINITE,
  CIRCE_DEADLINE_AS_INDICATED,
};

/// Process a new incoming raw Circe packet.
enum circe_result circe_handle_packet (const struct circe_location remote,
                                       const uint8_t *in, size_t len,
                                       uint64_t now_ms, uint8_t *out,
                                       size_t *out_len,
                                       struct circe_event *events,
                                       size_t *n_events);

/// Put outgoing packet into Circe's internal logic. DOES NOT ACTUALLY SEND IT
/// OVER THE NETWORK; that is handled opaquely by the caller and `circe_tick`.
enum circe_result
circe_send_outgoing_packet (const uint8_t remote_identity[CIRCE_IDENTITY_LEN],
                            const uint8_t *in, size_t len, uint64_t now_ms,
                            struct circe_event *events, size_t *n_events);

/// Get deadline and corresponding millisecond timestamp (for
/// `CIRCE_DEADLINE_AS_INDICATED`) for next timer deadline, at which point
/// `circe_tick` should be called. Should always be called immediately after
/// any other core API function is called to stay up-to-date.
enum circe_deadline circe_next_deadline (uint64_t *ms_timestamp);

/// Iterate the Circe core logic. Assumes `now_ms` increases monotonically with
/// time. If `out_len` is nonzero (do not pass in NULL), then `out` contains a
/// new raw Circe packet to be sent out to the location `destination`.
enum circe_result circe_tick (uint64_t now_ms, uint8_t *out, size_t *out_len,
                              struct circe_location *destination);

#endif