summaryrefslogtreecommitdiff
path: root/src/include/dgram.h
blob: 81fd1dd5c64089133b56ed05c06ba348a16f0de2 (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of Hyra nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef DGRAM_H
#define DGRAM_H

#include <stdint.h>
#include "if_ether.h"
#include "link.h"

/* Number of padding bytes in a squeak */
#define SQUEAK_NPAD 8

/* How many ms we should poll on recv */
#define RECV_POLL_MS 250

typedef int16_t tx_len_t;
typedef tx_len_t rx_len_t;

/*
 * Represents an ONET datagram
 *
 * @length: Packet length in bytes
 * @reserved: Reserved for future use
 * @type: Describes the type of packet (see OTYPE_*)
 * @reserved1: Reserved for future use
 * @port: Datagram port number to send on
 * @crc32: CRC32 checksum of data + header
 */
struct onet_dgram {
    uint16_t length;
    uint16_t reserved;
    uint8_t type : 3;
    uint16_t reserved1 : 13;
    uint8_t port;
    uint32_t crc32;
} __attribute__((packed));

/*
 * ONET packet types
 *
 * @OTYPE_DATA: Regular data to be sent
 * @OTYPE_SQUEAK: For peer discovery
 *
 * [ALL OTHER VALUES ARE RESERVED]
 *
 *  -- Squeaks --
 *
 *  A machine may squeak at the wire and those whom the squeak is
 *  intended for shall squeak back. One thing to be aware of is that
 *  this may allow squeak storms / attacks where a machine continuously
 *  squeaks at a wire.
 */
#define OTYPE_DATA      0x0
#define OTYPE_SQUEAK    0x1

/*
 * Get the total length of a datagram including
 * the length of the ethernet header and the header
 * of the datagram itself.
 */
#define DGRAM_LEN(len) \
    (sizeof(struct onet_dgram) + sizeof(struct ether_hdr) + len)

/*
 * Get the start of the datagram header start by passing
 * a pointer to the buffer that holds the entire packet
 */
#define DGRAM_HDR(packet_p) \
    ((void *)((char *)packet_p + sizeof(struct ether_hdr)))

/*
 * Get the start of the datagram data start by passing
 * a pointer to the buffer that holds the entire packet
 */
#define DGRAM_DATA(packet_p) \
    ((char *)packet_p + sizeof(struct onet_dgram) + sizeof(struct ether_hdr))

/*
 * Initialize an ONET datagram
 *
 * @length: Length of a packet to send
 * @port: Port number to send on
 * @type: Packet type (OTYPE_*)
 * @res: Result is written here
 *
 * Returns zero on success, otherwise a less than zero
 * value on failure.
 */
int dgram_load(
    uint16_t length, uint8_t port,
    uint8_t type, struct onet_dgram *res
);

/*
 * Send a datagram through ONET
 *
 * @link: The ONET link to send data over
 * @dst: Destination address to send to
 * @buf: The buffer containing data to send
 * @len: Length of buffer to send
 *
 * Returns the number of bytes transmitted on success, otherwise
 * a less than zero value on failure.
 */
tx_len_t dgram_send(
    struct onet_link *link, mac_addr_t dst,
    void *buf, uint16_t len
);

/*
 * Send a squeak through a wire
 *
 * @link: Link to squeak through
 * @dst: Destination address to squeak at
 *
 * Returns the length of the squeak on success, otherwise
 * a less than zero value on failure.
 */
tx_len_t dgram_squeak(struct onet_link *link, mac_addr_t dst);

/*
 * Get data from an ONET link
 *
 * @link: The ONET link to recv data from
 * @buf: The buffer to recv data into
 * @len: The length of expected data
 */
rx_len_t dgram_recv(struct onet_link *link, void *buf, uint16_t len);

#endif  /* DGRAM_H */