C2A_Core
gs_validate.c
[詳解]
1 #pragma section REPRO
7 #include "gs_validate.h"
8 #include "../../TlmCmd/Ccsds/tc_segment.h"
10 
11 #define GS_RECEIVE_WINDOW (256)
12 #define GS_POSITIVE_WINDOW_WIDTH_DEFAULT (64) // FIXME: 要検討
13 #if 2 * GS_POSITIVE_WINDOW_WIDTH_DEFAULT >= GS_RECEIVE_WINDOW
14 #error POSITIVE WINDOW SETTINGS IS WRONG
15 #endif
16 
17 // 以下検証関数. 名前通り
19 
20 static GS_VALIDATE_ERR GS_check_tc_segment_(const TcSegment* tc_segment);
21 static GS_VALIDATE_ERR GS_check_tcs_headers_(const TcSegment* tc_segment);
23 
28 
33 
38 
41 
42 void GS_validate_init(void)
43 {
49 }
50 
52 {
53  GS_VALIDATE_ERR ret;
54  uint8_t is_frame_error;
55  TCTF_TYPE tctf_type;
56 
57  ret = GS_check_tctf_header_(tctf);
58  if (ret != GS_VALIDATE_ERR_OK) return ret;
59  is_frame_error = TCTF_check_fecw(tctf);
60  if (!is_frame_error) return GS_VALIDATE_ERR_FECW_MISSMATCH;
61 
62  tctf_type = TCTF_get_type(tctf);
63  switch (tctf_type)
64  {
65  case TCTF_TYPE_AD:
66  ret = GS_check_ad_cmd_(tctf);
67  break;
68 
69  case TCTF_TYPE_BD:
70  ret = GS_check_bd_cmd_(tctf);
71  break;
72 
73  case TCTF_TYPE_BC:
74  ret = GS_check_bc_cmd_(tctf);
75  break;
76 
77  default:
79  }
80 
81  return ret;
82 }
83 
85 {
89 
90  return GS_VALIDATE_ERR_OK;
91 }
92 
94 {
95  GS_VALIDATE_ERR ack;
96  const CmdSpacePacket* csp = TCS_get_command_space_packet(tc_segment);
97 
98  // TcSegment Header の固定値部分が妥当か確認する
99  ack = GS_check_tcs_headers_(tc_segment);
100  if (ack != GS_VALIDATE_ERR_OK) return ack;
101 
102  // CmdSpacePacket のヘッダのうち共通部分が妥当か確認する
104  if (ack != GS_VALIDATE_ERR_OK) return ack;
105 
106  return GS_VALIDATE_ERR_OK;
107 }
108 
110 {
111  if (TCS_get_seq_flag(tc_segment) != TCS_SEQ_SINGLE)
112  {
114  }
115 
116  // FIXME: 以下要修正? (20210714)
117  // ここではNORMAL以外のMAP_IDをサポートしない (000010b)
118  // GSTOS側が送信するSegmentのMAP_IDは0x08となっている
119  // 要修正:対策が完了するまで暫定的に判定処理を無効化
120 
121  return GS_VALIDATE_ERR_OK;
122 }
123 
125 {
126  APID apid;
127  // FIXME: 他の部分のチェックも入れる
128 
129  if (CSP_get_ver(csp) != SP_VER_1) return GS_VALIDATE_ERR_CSP_VER;
131  {
132  // ここではSecondary Headerが必須。
134  }
135 
136  if (CSP_get_type(csp) != SP_TYPE_CMD)
137  {
139  }
140 
141  apid = CSP_get_apid(csp);
142  if ( !( apid == APID_MOBC_CMD ||
143  apid == APID_AOBC_CMD ||
144  apid == APID_TOBC_CMD ) )
145  {
146  return GS_VALIDATE_ERR_APID;
147  }
148 
149  // Sequence Flag が単パケットか確認する
151  {
153  }
154 
155  return GS_VALIDATE_ERR_OK;
156 }
157 
159 {
160  GS_VALIDATE_ERR ack;
161  const TcSegment* tc_segment = TCTF_get_tc_segment(tctf);
163 
165 
166  ack = GS_check_tc_segment_(tc_segment);
167  if (ack != GS_VALIDATE_ERR_OK) return ack;
168 
169  // N(R) == V(R)なら正常受信
170  if (seq_diff == 0)
171  {
174  return GS_VALIDATE_ERR_OK;
175  }
176  // 送信側が行き過ぎているのでパケット破棄して再送要求
177  else if (seq_diff <= gs_validate_info_.positive_window_width)
178  {
181  }
182  // もう既に送られているので破棄
183  else if ((256 - gs_validate_info_.positive_window_width) <= seq_diff)
184  {
186  }
187  // 許容 window から外れているので破棄してロックアウト, BC コマンドでロックアウト解除要求を行う
188  // ロックアウトするので一切のコマンドを受け付けない
189  else
190  {
193  }
194 
195  // not reaced
197 }
198 
200 {
201  GS_VALIDATE_ERR ack;
202  const TcSegment* tc_segment = TCTF_get_tc_segment(tctf);
203 
204  ack = GS_check_tc_segment_(tc_segment);
205  if (ack != GS_VALIDATE_ERR_OK) return ack;
206 
208 
209  return GS_VALIDATE_ERR_OK;
210 }
211 
212 // BCコマンドの種別を判定し、処理する
214 {
215  uint16_t length = TCTF_get_frame_len(tctf);
216  uint8_t offset = TCTF_HEADER_SIZE + TCTF_FECF_SIZE;
217  const TcSegment* tc_segment = TCTF_get_tc_segment(tctf);
218 
219  // BC コマンドは COP-1 制御の制御用コマンドで特殊なため少し構造が異なる
220  // Unlock
221  if (tc_segment->packet[0] == TCTF_BC_CMD_CODE_UNLOCK && length == offset + 1)
222  {
225 
227  }
228  // SET V(R)
229  else if (tc_segment->packet[0] == TCTF_BC_CMD_CODE_SET_VR_1ST_BYTE &&
230  tc_segment->packet[1] == TCTF_BC_CMD_CODE_SET_VR_2ND_BYTE &&
231  length == offset + 3)
232  {
234  {
235  gs_validate_info_.type_a_counter = tc_segment->packet[2];
237  }
238 
239  // Lockout状態でもType-B Counterの値は更新する
241  }
242  else
243  {
245  }
246 
247  return GS_VALIDATE_ERR_OK;
248 }
249 
250 uint32_t GS_form_clcw(void)
251 {
252  // 値が0固定の項目は変数の初期化で代替し明示的には指定しない
253  uint32_t clcw = 0;
254  uint32_t val;
255 
256  // FIXME: Status Field
257  // ***x xx** **** **** **** **** **** ****
258 
259  // COP in Effect -> COP-1
260  clcw |= 0x01000000; // **** **01 **** **** **** **** **** ****
261 
262  // FIXME: No RF Available Flag
263  // **** **** **** **** x*** **** **** ****
264  // FIXME: NO Bit Lock Flag
265  // **** **** **** **** *x** **** **** ****
266 
267  // Lockout flag
269  {
270  clcw |= 0x00002000; // **** **** **** **** **1* **** **** ****
271  }
272  // Retransmit
274  {
275  clcw |= 0x00000800; // **** **** **** **** **** 1*** **** ****
276  }
277 
278  // FARM B Counter
279  val = (gs_validate_info_.type_b_counter & 0x03) << 9;
280  clcw |= val; // **** **** **** **** **** *xx* **** ****
281 
282  // Type A Counter as Report Value
283  clcw |= gs_validate_info_.type_a_counter; // **** **** **** **** **** **** xxxx xxxx
284 
285  return clcw;
286 }
287 
288 GS_VALIDATE_ERR GS_set_farm_pw(uint8_t positive_window_width)
289 {
290  if (positive_window_width < 1 || positive_window_width > 127)
291  {
293  }
294 
295  gs_validate_info_.positive_window_width = positive_window_width;
296 
297  return GS_VALIDATE_ERR_OK;
298 }
299 
300 #pragma section
APID
Application Process ID
Definition: apid_define.h:17
@ APID_AOBC_CMD
01000010001b: APID for AOBC 宛の CMD
Definition: apid_define.h:19
@ APID_MOBC_CMD
01000010000b: APID for MOBC 宛の CMD
Definition: apid_define.h:18
@ APID_TOBC_CMD
01000010010b: APID for TOBC 宛の CMD
Definition: apid_define.h:20
SP_VER CSP_get_ver(const CmdSpacePacket *csp)
Version No を取得
SP_SEQ_FLAG CSP_get_seq_flag(const CmdSpacePacket *csp)
Sequence Flag を取得
APID CSP_get_apid(const CmdSpacePacket *csp)
APID を取得
SP_TYPE CSP_get_type(const CmdSpacePacket *csp)
Packet Type を取得
SP_2ND_HDR_FLAG CSP_get_2nd_hdr_flag(const CmdSpacePacket *csp)
Secondary Header Flag を取得
static GS_VALIDATE_ERR GS_check_tctf_header_(const TcTransferFrame *tctf)
Definition: gs_validate.c:84
#define GS_POSITIVE_WINDOW_WIDTH_DEFAULT
Definition: gs_validate.c:12
static GS_VALIDATE_ERR GS_check_bc_cmd_(const TcTransferFrame *tctf)
Definition: gs_validate.c:213
static GS_VALIDATE_ERR GS_check_ad_cmd_(const TcTransferFrame *tctf)
Definition: gs_validate.c:158
const GS_ValiateInfo *const gs_validate_info
Definition: gs_validate.c:40
static GS_ValiateInfo gs_validate_info_
Definition: gs_validate.c:39
void GS_validate_init(void)
GS_ValiateInfo の初期化
Definition: gs_validate.c:42
static GS_VALIDATE_ERR GS_check_tc_segment_(const TcSegment *tc_segment)
Definition: gs_validate.c:93
#define GS_RECEIVE_WINDOW
Definition: gs_validate.c:11
static GS_VALIDATE_ERR GS_check_cmd_space_packet_headers_(const CmdSpacePacket *csp)
Definition: gs_validate.c:124
GS_VALIDATE_ERR GS_set_farm_pw(uint8_t positive_window_width)
Positive Window Width の設定
Definition: gs_validate.c:288
static GS_VALIDATE_ERR GS_check_tcs_headers_(const TcSegment *tc_segment)
Definition: gs_validate.c:109
GS_VALIDATE_ERR GS_validate_tctf(const TcTransferFrame *tctf)
tctf の検証
Definition: gs_validate.c:51
uint32_t GS_form_clcw(void)
テレメ用の CLCW の作成
Definition: gs_validate.c:250
static GS_VALIDATE_ERR GS_check_bd_cmd_(const TcTransferFrame *tctf)
Definition: gs_validate.c:199
受信した TC Transfer Frame, TC Segment の検証を行う
GS_VALIDATE_ERR
gs_validate 関数の返り値
Definition: gs_validate.h:25
@ GS_VALIDATE_ERR_OK
Definition: gs_validate.h:26
@ GS_VALIDATE_ERR_FARM1_POSITIVE_WINDOW_AREA
Definition: gs_validate.h:39
@ GS_VALIDATE_ERR_FARM1_LOCKOUT_AREA
Definition: gs_validate.h:41
@ GS_VALIDATE_ERR_TCTF_VCID
Definition: gs_validate.h:29
@ GS_VALIDATE_ERR_CSP_2ND_HDR_FLAG
Definition: gs_validate.h:34
@ GS_VALIDATE_ERR_TCS_SEQ_FLAG
Definition: gs_validate.h:32
@ GS_VALIDATE_ERR_TCTF_SCID
Definition: gs_validate.h:28
@ GS_VALIDATE_ERR_CSP_SEQ_IS_NOT_SINGLE
Definition: gs_validate.h:37
@ GS_VALIDATE_ERR_TCTF_TYPE
Definition: gs_validate.h:30
@ GS_VALIDATE_ERR_CSP_VER
Definition: gs_validate.h:33
@ GS_VALIDATE_ERR_FARM1_NEGATIVE_WINDOW_AREA
Definition: gs_validate.h:40
@ GS_VALIDATE_ERR_APID
Definition: gs_validate.h:35
@ GS_VALIDATE_ERR_TCTF_VER
Definition: gs_validate.h:27
@ GS_VALIDATE_ERR_IN_LOCKOUT
Definition: gs_validate.h:31
@ GS_VALIDATE_ERR_FECW_MISSMATCH
Definition: gs_validate.h:38
@ GS_VALIDATE_ERR_INVALID_BC_CMD
Definition: gs_validate.h:42
@ GS_VALIDATE_ERR_UNKNOWN
Definition: gs_validate.h:43
@ GS_VALIDATE_ERR_CSP_TYPE_IS_NOT_CMD
Definition: gs_validate.h:36
@ SP_TYPE_CMD
1b: COMMAND
Definition: space_packet.h:66
@ SP_2ND_HDR_FLAG_PRESENT
1b: Secondary Header Present
Definition: space_packet.h:78
@ SP_SEQ_FLAG_SINGLE
11b: Standalone packet
Definition: space_packet.h:91
@ SP_VER_1
000b: Version-1
Definition: space_packet.h:53
SpacePacket 類 と CommonTlmCmdPacket 類が相互参照するのを回避するためのヘッダ
Space Packet (コマンド用)
uint8_t retransmit_flag
Definition: gs_validate.h:57
uint8_t type_b_counter
Definition: gs_validate.h:54
uint8_t type_a_counter
Definition: gs_validate.h:53
uint8_t positive_window_width
Definition: gs_validate.h:58
uint8_t lockout_flag
Definition: gs_validate.h:56
TC Segment のパケット構造体
Definition: tc_segment.h:34
uint8_t packet[TCS_PACKET_MAX_LENGTH]
Definition: tc_segment.h:35
TC Transfer Frame のパケット構造体
const CmdSpacePacket * TCS_get_command_space_packet(const TcSegment *tcs)
Command space packet 開始ポインタを取得
Definition: tc_segment.c:35
TCS_SEQ_FLAG TCS_get_seq_flag(const TcSegment *tcs)
sequence flag を取得
Definition: tc_segment.c:8
@ TCS_SEQ_SINGLE
Definition: tc_segment.h:48
const TcSegment * TCTF_get_tc_segment(const TcTransferFrame *tctf)
TC Segment を取得
uint8_t TCTF_check_fecw(const TcTransferFrame *tctf)
TCTF FECW のチェック
uint16_t TCTF_get_frame_len(const TcTransferFrame *tctf)
Frame Length を取得
TCTF_TYPE TCTF_get_type(const TcTransferFrame *tctf)
command type を取得
TCTF_SCID TCTF_get_scid(const TcTransferFrame *tctf)
SCID を取得
TCTF_VER TCTF_get_ver(const TcTransferFrame *tctf)
version を取得
uint8_t TCTF_get_frame_seq_num(const TcTransferFrame *tctf)
Frame Sequence Number を取得
TCTF_VCID TCTF_get_vcid(const TcTransferFrame *tctf)
VCID を取得
#define TCTF_FECF_SIZE
#define TCTF_BC_CMD_CODE_SET_VR_2ND_BYTE
@ TCTF_VER_1
#define TCTF_HEADER_SIZE
@ TCTF_SCID_SAMPLE_SATELLITE
#define TCTF_BC_CMD_CODE_SET_VR_1ST_BYTE
TCTF_TYPE
Type
@ TCTF_TYPE_BD
@ TCTF_TYPE_AD
@ TCTF_TYPE_BC
@ TCTF_VCID_REALTIME
#define TCTF_BC_CMD_CODE_UNLOCK