blob: 108bcaa02b8675ce4655869a774fdcbc65c85bc6 [file] [log] [blame]
Neels Hofmeyr3243c7c2018-09-30 05:01:20 +02001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* IuUP protocol handling, minimal implementation */
3
4#pragma once
5
6#include <osmocom/core/endian.h>
7#include <osmocom/core/msgb.h>
8
9#define OSMO_IUUP_HEADROOM 32
10
11enum osmo_iuup_pdu_type {
12 OSMO_IUUP_PDU_DATA_WITH_CRC = 0,
13 OSMO_IUUP_PDU_CONTROL_PROCEDURE = 14,
14};
15
16enum osmo_iuup_acknack {
17 OSMO_IUUP_ACKNACK_PROCEDURE = 0,
18 OSMO_IUUP_ACKNACK_ACK = 1,
19 OSMO_IUUP_ACKNACK_NACK = 2,
20};
21
22enum osmo_iuup_procedure {
23 OSMO_IUUP_PROC_INITIALIZATION = 0,
24};
25
26enum osmo_iuup_frame_good {
27 OSMO_IUUP_FRAME_GOOD = 0,
28 OSMO_IUUP_FRAME_BAD = 1,
29 OSMO_IUUP_FRAME_BAD_DUE_TO_RADIO = 2,
30};
31
32struct osmo_iuup_hdr_ctrl {
33#if OSMO_IS_BIG_ENDIAN
34 uint8_t pdu_type:4,
35 ack_nack:2,
36 frame_nr:2;
37 uint8_t mode_version:4,
38 procedure:4;
39 uint8_t header_crc:6,
40 payload_crc_hi:2;
41 uint8_t payload_crc_lo;
42 uint8_t payload[0];
43 uint8_t spare:3,
44 iptis_present:1,
45 subflows:3,
46 chain:1;
47#elif OSMO_IS_LITTLE_ENDIAN
48 uint8_t frame_nr:2,
49 ack_nack:2,
50 pdu_type:4;
51 uint8_t procedure:4,
52 mode_version:4;
53 uint8_t payload_crc_hi:2,
54 header_crc:6;
55 uint8_t payload_crc_lo;
56 uint8_t payload[0];
57 uint8_t spare:3,
58 iptis_present:1,
59 subflows:3,
60 chain:1;
61#endif
62} __attribute__((packed));
63
64struct osmo_iuup_hdr_data {
65#if OSMO_IS_BIG_ENDIAN
66 uint8_t pdu_type:4,
67 frame_nr:4;
68 uint8_t frame_good:2,
69 rfci:6;
70 uint8_t header_crc:6,
71 payload_crc_hi:2;
72 uint8_t payload_crc_lo;
73#elif OSMO_IS_LITTLE_ENDIAN
74 uint8_t frame_nr:4,
75 pdu_type:4;
76 uint8_t rfci:6,
77 frame_good:2;
78 uint8_t payload_crc_hi:2,
79 header_crc:6;
80 uint8_t payload_crc_lo;
81#endif
82 uint8_t payload[0];
83} __attribute__((packed));
84
85int osmo_iuup_classify(bool log_errors,
86 const char *log_label,
87 struct msgb *pdu,
88 struct osmo_iuup_hdr_ctrl **is_ctrl,
89 struct osmo_iuup_hdr_data **is_data);
90bool osmo_iuup_is_init(struct msgb *pdu);
91void osmo_iuup_make_init_ack(struct msgb *ack);
92void osmo_iuup_set_checksums(uint8_t *iuup_header_and_payload, unsigned int header_and_payload_len);