Xenomai 3.3.2
Loading...
Searching...
No Matches
rtcfg_frame.h
1/***
2 *
3 * include/rtcfg/rtcfg_frame.h
4 *
5 * Real-Time Configuration Distribution Protocol
6 *
7 * Copyright (C) 2003 Jan Kiszka <jan.kiszka@web.de>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 */
24
25#ifndef __RTCFG_FRAME_H_
26#define __RTCFG_FRAME_H_
27
28#include <linux/init.h>
29#include <linux/if_packet.h>
30#include <asm/byteorder.h>
31
32#include <rtcfg/rtcfg_event.h>
33
34#define ETH_RTCFG 0x9022
35
36#define RTCFG_SKB_PRIO \
37 RTSKB_PRIO_VALUE(QUEUE_MIN_PRIO - 1, RTSKB_DEF_NRT_CHANNEL)
38
39#define RTCFG_ID_STAGE_1_CFG 0
40#define RTCFG_ID_ANNOUNCE_NEW 1
41#define RTCFG_ID_ANNOUNCE_REPLY 2
42#define RTCFG_ID_STAGE_2_CFG 3
43#define RTCFG_ID_STAGE_2_CFG_FRAG 4
44#define RTCFG_ID_ACK_CFG 5
45#define RTCFG_ID_READY 6
46#define RTCFG_ID_HEARTBEAT 7
47#define RTCFG_ID_DEAD_STATION 8
48
49#define RTCFG_ADDRSIZE_MAC 0
50#define RTCFG_ADDRSIZE_IP 4
51#define RTCFG_MAX_ADDRSIZE RTCFG_ADDRSIZE_IP
52
53#define RTCFG_FLAG_STAGE_2_DATA 0
54#define RTCFG_FLAG_READY 1
55
56#define _RTCFG_FLAG_STAGE_2_DATA (1 << RTCFG_FLAG_STAGE_2_DATA)
57#define _RTCFG_FLAG_READY (1 << RTCFG_FLAG_READY)
58
59struct rtcfg_frm_head {
60#if defined(__LITTLE_ENDIAN_BITFIELD)
61 u8 id : 5;
62 u8 version : 3;
63#elif defined(__BIG_ENDIAN_BITFIELD)
64 u8 version : 3;
65 u8 id : 5;
66#else
67#error unsupported byte order
68#endif
69} __attribute__((packed));
70
71struct rtcfg_frm_stage_1_cfg {
72 struct rtcfg_frm_head head;
73 u8 addr_type;
74 u8 client_addr[0];
75 u8 server_addr[0];
76 u8 burstrate;
77 u16 cfg_len;
78 u8 cfg_data[0];
79} __attribute__((packed));
80
81struct rtcfg_frm_announce {
82 struct rtcfg_frm_head head;
83 u8 addr_type;
84 u8 addr[0];
85 u8 flags;
86 u8 burstrate;
87} __attribute__((packed));
88
89struct rtcfg_frm_stage_2_cfg {
90 struct rtcfg_frm_head head;
91 u8 flags;
92 u32 stations;
93 u16 heartbeat_period;
94 u32 cfg_len;
95 u8 cfg_data[0];
96} __attribute__((packed));
97
98struct rtcfg_frm_stage_2_cfg_frag {
99 struct rtcfg_frm_head head;
100 u32 frag_offs;
101 u8 cfg_data[0];
102} __attribute__((packed));
103
104struct rtcfg_frm_ack_cfg {
105 struct rtcfg_frm_head head;
106 u32 ack_len;
107} __attribute__((packed));
108
109struct rtcfg_frm_simple {
110 struct rtcfg_frm_head head;
111} __attribute__((packed));
112
113struct rtcfg_frm_dead_station {
114 struct rtcfg_frm_head head;
115 u8 addr_type;
116 u8 logical_addr[0];
117 u8 physical_addr[32];
118} __attribute__((packed));
119
120int rtcfg_send_stage_1(struct rtcfg_connection *conn);
121int rtcfg_send_stage_2(struct rtcfg_connection *conn, int send_data);
122int rtcfg_send_stage_2_frag(struct rtcfg_connection *conn);
123int rtcfg_send_announce_new(int ifindex);
124int rtcfg_send_announce_reply(int ifindex, u8 *dest_mac_addr);
125int rtcfg_send_ack(int ifindex);
126int rtcfg_send_dead_station(struct rtcfg_connection *conn);
127
128int rtcfg_send_simple_frame(int ifindex, int frame_id, u8 *dest_addr);
129
130#define rtcfg_send_ready(ifindex) \
131 rtcfg_send_simple_frame(ifindex, RTCFG_ID_READY, NULL)
132#define rtcfg_send_heartbeat(ifindex) \
133 rtcfg_send_simple_frame(ifindex, RTCFG_ID_HEARTBEAT, \
134 device[ifindex].spec.clt.srv_mac_addr)
135
136int __init rtcfg_init_frames(void);
137void rtcfg_cleanup_frames(void);
138
139#endif /* __RTCFG_FRAME_H_ */