summaryrefslogtreecommitdiff
path: root/lib/common/avb.h
blob: 55ffc1954a58aedd673f58226334678818bd57da (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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
 /*
  * Copyright (c) <2013>, Intel Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU Lesser General Public License,
  * version 2.1, as published by the Free Software Foundation.
  *
  * This program is distributed in the hope it will be useful, but WITHOUT
  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
  * more details.
  *
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  *
 */

#ifndef __AVBTP_H__
#define __AVBTP_H__

#include <inttypes.h>

#include <igb.h>

#define VALID		1
#define INVALID		0

#define MAC_ADDR_LEN	6

#define IGB_BIND_NAMESZ		24

#define SHM_SIZE (4*8 + sizeof(pthread_mutex_t)) /* 3 - 64 bit and 2 - 32 bits */
#define SHM_NAME  "/ptp"

#define MAX_SAMPLE_VALUE ((1U << ((sizeof(int32_t)*8)-1))-1)

#define IEEE_61883_IIDC_SUBTYPE 0x0

#define MRPD_PORT_DEFAULT 7500

#define STREAM_ID_SIZE		8

#define ETHER_TYPE_AVTP		0x22f0

typedef struct __attribute__ ((packed)) {
	uint64_t subtype:7;
	uint64_t cd_indicator:1;
	uint64_t timestamp_valid:1;
	uint64_t gateway_valid:1;
	uint64_t reserved0:1;
	uint64_t reset:1;
	uint64_t version:3;
	uint64_t sid_valid:1;
	uint64_t seq_number:8;
	uint64_t timestamp_uncertain:1;
	uint64_t reserved1:7;
	uint64_t stream_id;
	uint64_t timestamp:32;
	uint64_t gateway_info:32;
	uint64_t length:16;

} seventeen22_header;

/* 61883 CIP with SYT Field */
typedef struct {
	uint16_t packet_channel:6;
	uint16_t format_tag:2;
	uint16_t app_control:4;
	uint16_t packet_tcode:4;
	uint16_t source_id:6;
	uint16_t reserved0:2;
	uint16_t data_block_size:8;
	uint16_t reserved1:2;
	uint16_t source_packet_header:1;
	uint16_t quadlet_padding_count:3;
	uint16_t fraction_number:2;
	uint16_t data_block_continuity:8;
	uint16_t format_id:6;
	uint16_t eoh:2;
	uint16_t format_dependent_field:8;
	uint16_t syt;
} six1883_header;

typedef struct {
	uint8_t label;
	uint8_t value[3];
} six1883_sample;

#define ETH_ALEN   6 /* Size of Ethernet address */

typedef struct __attribute__ ((packed)) {
	/* Destination MAC address. */
	uint8_t h_dest [ETH_ALEN];
	/* Destination MAC address. */
	uint8_t h_source [ETH_ALEN];
	/* Protocol ID. */
	uint8_t h_protocol[2];
} eth_header;

typedef long double FrequencyRatio;

typedef struct { 
	int64_t ml_phoffset;
	int64_t ls_phoffset;
	FrequencyRatio ml_freqoffset;
	FrequencyRatio ls_freqoffset;
	uint64_t local_time;
} gPtpTimeData;

/*TODO fix this*/
#ifndef false
typedef enum { false = 0, true = 1 } bool;
#endif

int pci_connect(device_t * igb_dev);

int gptpinit(int *shm_fd, char **shm_map);
int gptpdeinit(int *shm_fd, char **shm_map);
int gptpgetdata(char *shm_mmap, gPtpTimeData *td);
int gptpscaling(char *shm_mmap, gPtpTimeData *td);
bool gptplocaltime(const gPtpTimeData * td, uint64_t* now_local);

void avb_set_1722_cd_indicator(seventeen22_header *h1722, uint64_t cd_indicator);
uint64_t avb_get_1722_cd_indicator(seventeen22_header *h1722);
void avb_set_1722_subtype(seventeen22_header *h1722, uint64_t subtype);
uint64_t avb_get_1722_subtype(seventeen22_header *h1722);
void avb_set_1722_sid_valid(seventeen22_header *h1722, uint64_t sid_valid);
uint64_t avb_get_1722_sid_valid(seventeen22_header *h1722);
void avb_set_1722_version(seventeen22_header *h1722, uint64_t version);
uint64_t avb_get_1722_version(seventeen22_header *h1722);
void avb_set_1722_reset(seventeen22_header *h1722, uint64_t reset);
uint64_t avb_get_1722_reset(seventeen22_header *h1722);
void avb_set_1722_reserved0(seventeen22_header *h1722, uint64_t reserved0);
uint64_t avb_get_1722_reserved0(seventeen22_header *h1722);
void avb_set_1722_reserved1(seventeen22_header *h1722, uint64_t reserved1);
uint64_t avb_get_1722_reserved1(seventeen22_header *h1722);
void avb_set_1722_timestamp_uncertain(seventeen22_header *h1722, uint64_t timestamp_uncertain);
uint64_t avb_get_1722_timestamp_uncertain(seventeen22_header *h1722);
void avb_set_1722_timestamp(seventeen22_header *h1722, uint64_t timestamp);
uint64_t avb_get_1722_reset(seventeen22_header *h1722);
void avb_set_1722_reserved0(seventeen22_header *h1722, uint64_t reserved0);
uint64_t avb_get_1722_reserved0(seventeen22_header *h1722);
void avb_set_1722_gateway_valid(seventeen22_header *h1722, uint64_t gateway_valid);
uint64_t avb_get_1722_gateway_valid(seventeen22_header *h1722);
void avb_set_1722_timestamp_valid(seventeen22_header *h1722, uint64_t timestamp_valid);
uint64_t avb_get_1722_timestamp_valid(seventeen22_header *h1722);
void avb_set_1722_reserved1(seventeen22_header *h1722, uint64_t reserved1);
uint64_t avb_get_1722_reserved1(seventeen22_header *h1722);
void avb_set_1722_timestamp_uncertain(seventeen22_header *h1722, uint64_t timestamp_uncertain);
uint64_t avb_get_1722_timestamp_uncertain(seventeen22_header *h1722);
void avb_set_1722_timestamp(seventeen22_header *h1722, uint64_t timestamp);
uint64_t avb_get_1722_timestamp(seventeen22_header *h1722);
void avb_set_1722_gateway_info(seventeen22_header *h1722, uint64_t gateway_info);
uint64_t avb_get_1722_gateway_info(seventeen22_header *h1722);
void avb_set_1722_length(seventeen22_header *h1722, uint64_t length);
uint64_t avb_get_1722_length(seventeen22_header *h1722);
void avb_set_1722_stream_id(seventeen22_header *h1722, uint64_t stream_id);
uint64_t avb_get_1722_stream_id(seventeen22_header *h1722);
void avb_set_1722_seq_number(seventeen22_header *h1722, uint64_t seq_number);
uint64_t avb_get_1722_seq_number(seventeen22_header *h1722);

void avb_set_61883_packet_channel(six1883_header *h61883, uint16_t packet_channel);
uint16_t avb_get_61883_length(six1883_header *h61883);
void avb_set_61883_format_tag(six1883_header *h61883, uint16_t format_tag);
uint16_t avb_get_61883_format_tag(six1883_header *h61883);
void avb_set_61883_app_control(six1883_header *h61883, uint16_t app_control);
uint16_t avb_get_61883_app_control(six1883_header *h61883);
void avb_set_61883_packet_tcode(six1883_header *h61883, uint16_t packet_tcode);
uint16_t avb_get_61883_packet_tcode(six1883_header *h61883);
void avb_set_61883_source_id(six1883_header *h61883, uint16_t source_id);
uint16_t avb_get_61883_source_id(six1883_header *h61883);
void avb_set_61883_reserved0(six1883_header *h61883, uint16_t reserved0);
uint16_t avb_get_61883_reserved0(six1883_header *h61883);
void avb_set_61883_data_block_size(six1883_header *h61883, uint16_t data_block_size);
uint16_t avb_get_61883_data_block_size(six1883_header *h61883);
void avb_set_61883_reserved1(six1883_header *h61883, uint16_t reserved1);
uint16_t avb_get_61883_reserved1(six1883_header *h61883);
void avb_set_61883_source_packet_header(six1883_header *h61883, uint16_t source_packet_header);
uint16_t avb_get_61883_source_packet_header(six1883_header *h61883);
void avb_set_61883_quadlet_padding_count(six1883_header *h61883, uint16_t quadlet_padding_count);
uint16_t avb_get_61883_quadlet_padding_count(six1883_header *h61883);
void avb_set_61883_fraction_number(six1883_header *h61883, uint16_t fraction_number);
uint16_t avb_get_61883_fraction_number(six1883_header *h61883);
void avb_set_61883_data_block_continuity(six1883_header *h61883, uint16_t data_block_continuity);
uint16_t avb_get_61883_data_block_continuity(six1883_header *h61883);
void avb_set_61883_format_id(six1883_header *h61883, uint16_t format_id);
uint16_t avb_get_61883_format_id(six1883_header *h61883);
void avb_set_61883_eoh(six1883_header *h61883, uint16_t eoh);
uint16_t avb_get_61883_eoh(six1883_header *h61883);
void avb_set_61883_format_dependent_field(six1883_header *h61883, uint16_t format_dependent_field);
uint16_t avb_get_61883_format_dependent_field(six1883_header *h61883);
void avb_set_61883_syt(six1883_header *h61883, uint16_t syt);
uint16_t avb_get_61883_syt(six1883_header *h61883);

void * avb_create_packet(uint32_t payload_len);

void avb_initialize_h1722_to_defaults(seventeen22_header *h1722);

void avb_initialize_61883_to_defaults(six1883_header *h61883);

int32_t avb_get_iface_mac_address(int8_t *iface, uint8_t *addr);

int32_t
avb_eth_header_set_mac(eth_header *ethernet_header, uint8_t *addr, int8_t *iface);

void avb_1722_set_eth_type(eth_header *eth_header);

#endif		/*  __AVBTP_H__ */