/////////////////////////////////////////////////////////////////////////////// // // // Copyright Test Competence Center(TCC) ETH 2003 // // // // The copyright to the computer program(s) herein is the property of TCC. // // The program(s) may be used and/or copied only with the written permission // // of TCC or in accordance with the terms and conditions stipulated in the // // agreement/contract under which the program(s) has been supplied. // // // /////////////////////////////////////////////////////////////////////////////// // // File: ROHC_Types.ttcn // Description: ROHC // Rev: R3A01 // Prodnr: CNL 113 426 // Updated: 2006.04.13 // Contact: http://ttcn.ericsson.se // /* Based on RFC 3095, July 2001 */ /* TODO: improvements:: - Profile4_Dynamic_Chain_u should not contain the sn field ethesi */ module ROHC_Types { import from General_Types all; external function f_ROHC_enc(in ROHC_packet_u pdu, in ROHC_config p_config) return octetstring; external function f_ROHC_dec(in octetstring data, inout ROHC_config p_config) return ROHC_packet_u; external function f_ROHC_CRC(in octetstring data, in integer crclen) return integer; external function f_FBCK_enc(in Feedback_data pdu, in ROHC_config p_config) return octetstring; external function f_FBCK_dec(in octetstring data, in ROHC_config p_config) return Feedback_data; /* Constants for ROHC mode field values including mode cancellation */ const integer cg_ROHC_mode_C := 0; const integer cg_ROHC_mode_U := 1; const integer cg_ROHC_mode_O := 2; const integer cg_ROHC_mode_R := 3; /* Constants for ROHC feedback type */ const integer cg_ROHC_fbck_type_ACK := 0; const integer cg_ROHC_fbck_type_NACK := 1; const integer cg_ROHC_fbck_type_SNACK := 2; const integer cg_ROHC_fbck_type_reserved := 3; type bitstring ROHC_BIT7_BO_LAST length (7) with {variant "BYTEORDER(last)"}; type enumerated Packet_type { R_0(0), R_0_CRC(1), UO_0(2), R_1(3), R_1_ID(4), R_1_TS(5), UO_1(6), UO_1_ID(7), UO_1_TS(8), UOR_2(9), UOR_2_ID(10), UOR_2_TS(11), IR(12), IR_DYN(13), NOPKT(14) }; /* ==================== ROHC configuration and context ==================== */ type record IP_context { /* Version of this IP level. MSB bit may be set (Profile 4 only). */ integer version, /* RND bit of this IP level (RND or RND2) */ boolean rnd_bit, /* Whether AH is present in the IPX index list */ boolean ah_present, /* Whether GRE is present in the IPX index list */ boolean gre_present, /* Whether ESP is present in the IPX index list */ boolean esp_present, /* Length of the compressed AH data field after the base header */ integer ah_data_len, /* Whether GRE header has GRE checksum or not */ boolean gre_cksum_present }; type record UDP_context { boolean udp_cksum }; type record of IP_context IP_contexts; type record ROHC_context { integer mode, integer profile, /* The decoded packet type */ Packet_type pkt, IP_contexts ip_ctx, UDP_context udp_ctx }; type record of integer int_array; type record of ROHC_context ROHC_context_rof; type record ROHC_config { boolean large_cid, int_array rtp_ports, ROHC_context_rof context }; type port ROHC_ASP_SP_PT message { inout ROHC_packet_u; inout octetstring; } with { extension "internal" } /* ROHC Configuration port */ type record ROHC_ROHCCFG_REQ_setconfig { ROHC_config config } type enumerated ROHC_ROHCCFG_REQ_operation { rohccfg_getconfig } type union ROHC_ROHCCFG_REQ { ROHC_ROHCCFG_REQ_operation simpleop, ROHC_ROHCCFG_REQ_setconfig setconfig } type enumerated ROHC_ROHCCFG_RSP_operation { rohccfg_ok } type record ROHC_ROHCCFG_RSP_config { ROHC_config config } type union ROHC_ROHCCFG_RSP { ROHC_ROHCCFG_RSP_operation simpleop, ROHC_ROHCCFG_RSP_config config } type port ROHC_PORTCFG_PT message { inout ROHC_config; inout charstring; inout ROHC_ROHCCFG_REQ; inout ROHC_ROHCCFG_RSP; } with { extension "internal" } type union ROHC_packet_u { ROHC_packet rohc, Segment_packet segment } type record ROHC_packet /* p.42 */ { Padding padding optional, Feedback feedback optional, Header header, Payload payload optional }; /* TODO CHECK: why this is needed ? type record Reconstructed_unit { octetstring reconstructed_packet, OCT4 CRC }; */ type record Segment_packet /* p.50 */ { Padding padding optional, Feedback feedback optional, INT7b segment_header_id, /* Must be 127 (0x7F) */ boolean final, Payload payload optional, integer crc optional }; type octetstring Padding; /* Must be a serie of 0xE0 */ type octetstring Payload; type OCT1n Feedback1; /* p.91 */ type record Feedback_opts_u /* p.91 */ { INT4b opt_type, INT4b opt_len, octetstring opt_data optional }; type record of Feedback_opts_u Feedback_opts; /* p.91 */ type record Feedback2 /* p.91 */ { INT2b acktype, INT2b mode, INT12b_BO_LAST sn, Feedback_opts feedback_opts optional }; type union Feedback_type /* p.46 */ { Feedback1 feedback1, Feedback2 feedback2 }; type record Feedback_data /* p.46 */ { INT14b_BO_LAST cid, Feedback_type feedback_type }; type record Feedback_u /* p.45 */ { BIT5 feedback_type, /* Must be '11110'B */ INT3b code, LIN1 size optional, /* TODO: size could be 0, so feedback_data should be optional; although it's a weird case, but still possible */ Feedback_data feedback_data }; type record of Feedback_u Feedback; /* p.42 */ type union Header /* p.77 */ { Profile0_headers prof0, Profile1_headers prof1, Profile2_headers prof2, Profile4_headers prof4 }; //Profile0 type union Profile0_headers { Profile0_IR_packet ir, Profile0_normal_packet normal }; type record Profile0_IR_packet /* p.127 */ { INT14b_BO_LAST cid, BIT7 type_ind, /* Must be '1111110'B */ BIT1 d, /* Must be 0 */ LIN1 profile, /* Must be 0 */ LIN1 crc, octetstring orig_packet }; type record Profile0_normal_packet /* p.128 */ { INT14b_BO_LAST cid, octetstring orig_packet }; //Profile1 type record Profile1_headers /* p.77 */ { Profile1_base_header base_header, Profile1_Extension ext optional, LIN2_BO_LAST ip_id_outer optional, octetstring ah_outer optional, LIN2_BO_LAST gre_cksum1 optional, LIN2_BO_LAST ip_id_inner optional, octetstring ah_inner optional, LIN2_BO_LAST gre_cksum2 optional, LIN2_BO_LAST udp_cksum optional }; type union Profile1_base_header { Profile1_IR_header ir, Profile1_IR_DYN_header ir_dyn, Profile1_R_0_header r_0, Profile1_R_0_CRC_header r_0_crc, Profile1_UO_0_header uo_0, Profile1_R_1_header r_1, Profile1_R_1_ID_header r_1_id, Profile1_R_1_TS_header r_1_ts, Profile1_UO_1_header uo_1, Profile1_UO_1_ID_header uo_1_id, Profile1_UO_1_TS_header uo_1_ts, Profile1_UOR_2_header uor_2, Profile1_UOR_2_ID_header uor_2_id, Profile1_UOR_2_TS_header uor_2_ts }; type union Static_Chain_u /* p.91 */ { IPv4_Static ipv4_stat, IPv6_Static ipv6_stat, UDP_Static udp_stat, RTP_Static rtp_stat, ESP_Static esp_stat }; type union Dynamic_Chain_u /* p.91 */ { IPv4_Dynamic ipv4_dyn, IPv6_Dynamic ipv6_dyn, UDP_Dynamic udp_dyn, RTP_Dynamic rtp_dyn, ESP_Dynamic esp_dyn }; type record of Static_Chain_u Static_Chain; /* p.91 */ type record of Dynamic_Chain_u Dynamic_Chain; /* p.91 */ type record Profile1_IR_header /* p.45 */ /* p.91 */ { INT14b_BO_LAST cid, BIT7 type_ind, /* Must be '1111110'B */ BIT1 d, LIN1 profile, /* Must be 1 */ LIN1 crc, Static_Chain stat_chain, Dynamic_Chain dyn_chain optional }; type record Profile1_IR_DYN_header /* p.46 */ /* p.92 */ { INT14b_BO_LAST cid, BIT8 type_ind, /* Must be '11111000'B */ LIN1 profile, /* Must be 1 */ LIN1 crc, Dynamic_Chain dyn_chain }; type record Profile1_R_0_header /* p.74 */ { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '00'B */ INT6b sn }; type record Profile1_R_0_CRC_header /* p.74 */ { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '01'B */ INT7b sn, INT7b crc }; type record Profile1_UO_0_header /* p.75 */ { INT14b_BO_LAST cid, BIT1 type_ind, /* Must be '0'B */ INT4b sn, INT3b crc }; type record Profile1_R_1_header /* p.75 */ { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '10'B */ INT6b sn, BIT1 m_bit, BIT1 x_bit, INT6b ts }; type record Profile1_R_1_ID_header /* p.75 */ { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '10'B */ INT6b sn, BIT1 m_bit, BIT1 x_bit, BIT1 t_bit, /* Must be '0'B */ INT5b ip_id }; type record Profile1_R_1_TS_header /* p.75 */ { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '10'B */ INT6b sn, BIT1 m_bit, BIT1 x_bit, BIT1 t_bit, /* Must be '1'B */ INT5b ts }; type record Profile1_UO_1_header /* p.76 */ { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '10'B */ INT6b ts, BIT1 m_bit, INT4b sn, INT3b crc }; type record Profile1_UO_1_ID_header /* p.76 */ { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '10'B */ BIT1 t_bit, /* Must be '0'B */ INT5b ip_id, BIT1 x_bit, INT4b sn, INT3b crc }; type record Profile1_UO_1_TS_header /* p.76 */ { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '10'B */ BIT1 t_bit, /* Must be '1'B */ INT5b ts, BIT1 m_bit, INT4b sn, INT3b crc }; type record Profile1_UOR_2_header /* p.77 */ { INT14b_BO_LAST cid, BIT3 type_ind, /* Must be '110'B */ INT6b ts, BIT1 m_bit, INT6b sn, BIT1 x_bit, INT7b crc }; type record Profile1_UOR_2_ID_header /* p.77 */ { INT14b_BO_LAST cid, BIT3 type_ind, /* Must be '110'B */ INT5b ip_id, BIT1 t_bit, /* Must be '0'B */ BIT1 m_bit, INT6b sn, BIT1 x_bit, INT7b crc }; type record Profile1_UOR_2_TS_header /* p.77 */ { INT14b_BO_LAST cid, BIT3 type_ind, /* Must be '110'B */ INT5b ts, BIT1 t_bit, /* Must be '1'B */ BIT1 m_bit, INT6b sn, BIT1 x_bit, INT7b crc }; type record Short_Seqnum /* p.120 */ { BIT1 ind, /* Must be '0'B */ INT7b lsb_of_seqnum }; type record Long_Seqnum /* p.120 */ { BIT1 ind, /* Must be '1'B */ INT31b_BO_LAST lsb_of_seqnum }; type union AEGSeqnum /* p.112 */ { Short_Seqnum short_form, Long_Seqnum long_form }; type record XI_Item4_r /* p.121 */ { BIT1 x_ind, INT3b index }; type record XI_Item8_r /* p.121 */ { BIT1 x_ind, INT7b index }; type record of XI_Item4_r XI_Item4; type record of XI_Item8_r XI_Item8; type union XI_list /* p.113 */ { XI_Item4 xi_item4, XI_Item8 xi_item8 }; type record IPv6_ext_item { LIN1 nexthead, LIN1 hdr_ext_len, octetstring data } type record MINE_item { LIN1 protocol, BIT1 s_bit, ROHC_BIT7_BO_LAST reserved, LIN2_BO_LAST cksum, OCT4 dstaddr, OCT4 srcaddr optional } with { variant "FIELDORDER(msb)"; variant (srcaddr) "PRESENCE(s_bit = '1'B)"; } /* TODO: check why better use INTn intead of OCTn */ type record AH_item /* RFC 2402, p.3 */ { LIN1 nexthead, /* Must be 51 */ LIN1 payload_len, LIN2_BO_LAST reserved, /* Must be 0 */ LIN4_BO_LAST spi, LIN4_BO_LAST sn, octetstring auth_data optional } type record ESP_item { LIN1 nexthead, /* Must be 50 */ LIN4_BO_LAST spi, LIN4_BO_LAST sn } type record GRE_item { LIN1 nexthead, /* Must be 47 */ BIT1 C_bit, BIT1 reserved_1, /* Must be '0'B */ BIT1 K_bit, BIT1 S_bit, BIT1 reserved_2, /* Must be '0'B */ BIT3 version, LIN2_BO_LAST cksum optional, LIN4_BO_LAST key optional, LIN4_BO_LAST sn optional } type union Item { IPv6_ext_item ipv6_ext_item, AH_item ah_item, ESP_item esp_item, GRE_item gre_item, MINE_item mine_item /* TODO CHECK: could we use it ? octetstring any_item */ } type record of Item IP_Item_list; type record of OCT4n CSRC_Item_list; /* TODO: temporary solution for profile4 tests */ type record of octetstring RAW_data; type union Item_list { CSRC_Item_list csrc_item_list, IP_Item_list ip_item_list, /* TODO: temporary solution for profile4 tests */ RAW_data raw_data } type record Enc_Type_0 /* p.112 */ { BIT2 et, /* Must be '00'B */ BIT1 gp_bit, BIT1 ps_bit, INT4b cc, LIN1 gen_id optional, XI_list xi_list optional, BIT4 padding optional, /* Must be '0000'B */ Item_list item_list optional }; type record Enc_Type_1 /* p.114 */ { BIT2 et, /* Must be '01'B */ BIT1 gp_bit, BIT1 ps_bit, INT4b xi1, LIN1 gen_id optional, LIN1 ref_id, octetstring insbitmask, XI_list xi_list optional, BIT4 padding optional, /* Must be '0000'B */ Item_list item_list optional }; type record Enc_Type_2 /* p.115 */ { BIT2 et, /* Must be '10'B */ BIT1 gp_bit, BIT1 res, INT4b count, LIN1 gen_id optional, LIN1 ref_id, octetstring rembitmask }; type record Enc_Type_3 /* p.115 */ { BIT2 et, /* Must be '11'B */ BIT1 gp_bit, BIT1 ps_bit, INT4b xi1, LIN1 gen_id optional, LIN1 ref_id, octetstring rembitmask, octetstring insbitmask, XI_list xi_list optional, BIT4 padding optional, /* Must be '0000'B */ Item_list item_list optional }; type record IPv4_Static /* p.94 */ { INT4b version, /* Must be '0100'B */ INT4b reserved, /* Must be '0000'B */ LIN1 proto, OCT4 srcaddr, OCT4 dstaddr }; type record IPv4_Dynamic /* p.94 */ { LIN1 tos, LIN1 ttl, LIN2_BO_LAST identification, BIT1 df_bit, BIT1 rnd_bit, BIT1 nbo_bit, BIT5 reserved, /* Must be '00000'B */ Enc_Type_0 genextheadlist }; type record IPv6_Static /* p.93 */ { INT4b version, /* Must be '0110'B */ INT20b_BO_LAST flowlabel, LIN1 nexthead, OCT16 srcaddr, OCT16 dstaddr }; type record IPv6_Dynamic /* p.93 */ { LIN1 trafficclass, LIN1 hoplimit, Enc_Type_0 genextheadlist }; type record UDP_Static /* p.95 */ { LIN2_BO_LAST srcport, LIN2_BO_LAST dstport }; type record UDP_Dynamic /* p.95 */ { LIN2_BO_LAST cksum }; type record RTP_Static /* p.96 */ { OCT4 ssrc }; type record Rx_Field /* p.96 */ { BIT3 reserved, /* Must be '000'B */ BIT1 xbit, INT2b mode, BIT1 tisbit, BIT1 tssbit }; type record RTP_Dynamic /* p.96 */ { INT2b vfield, /* Must be '10'B */ BIT1 pbit, BIT1 rxbit, INT4b ccfield, BIT1 mbit, INT7b ptfield, LIN2_BO_LAST rtpseqnum, LIN4_BO_LAST rtpts, Enc_Type_0 gencsrclist, Rx_Field rx_field optional, integer ts_stride optional, integer time_stride optional }; type record ESP_Static /* p.97 */ { LIN4_BO_LAST spi }; type record ESP_Dynamic /* p.97 */ { LIN4_BO_LAST seqnum }; type union Compr_head_list /* p.112 */ { Enc_Type_0 enctype0, Enc_Type_1 enctype1, Enc_Type_2 enctype2, Enc_Type_3 enctype3 }; type record IP_Ext_heads /* p.111 */ { BIT1 cl, BIT1 aseq, BIT1 eseq, BIT1 gseq, BIT4 res, AEGSeqnum ah_seq optional, AEGSeqnum esp_seq optional, AEGSeqnum gre_seq optional, Compr_head_list compr_head_list optional }; type record Outer_IP_fields /* p.82 */ { LIN1 tos optional, LIN1 ttl optional, LIN1 proto optional, IP_Ext_heads ext_heads optional, LIN2_BO_LAST ip_id optional }; type record Outer_IP_flags /* p.81 */ { BIT1 tos2, BIT1 ttl2, BIT1 df2, BIT1 pr2, BIT1 ipx2, BIT1 nbo2, BIT1 rnd2, BIT1 i2_bit }; type record Inner_IP_fields /* p.81 */ { LIN1 tos optional, LIN1 ttl optional, LIN1 proto optional, IP_Ext_heads ext_heads optional }; type record Inner_IP_flags /* p.80 */ { BIT1 tos, BIT1 ttl, BIT1 df, BIT1 pr, BIT1 ipx, BIT1 nbo, BIT1 rnd_bit, BIT1 ip2_bit }; type record RTP_flags { BIT1 r_p, INT7b rtp_pt } type record RTP_flags_fields /* p.82 */ { INT2b mode, BIT1 r_pt, BIT1 m_bit, BIT1 r_x, BIT1 csrc, BIT1 tss, BIT1 tis, RTP_flags flags optional, Compr_head_list csrc_list optional, integer ts_stride optional, integer time_stride optional } type record Extension0 /* p.79 */ { BIT2 ext_type, /* Must be '00'B */ INT3b sn, INT3b plust } type record Extension1 /* p.79 */ { BIT2 ext_type, /* Must be '01'B */ INT3b sn, INT3b plust, LIN1 minust }; type record Extension2 /* p.79 */ { BIT2 ext_type, /* Must be '10'B */ INT3b sn, INT11b_BO_LAST plust, LIN1 minust }; type record Extension3 /* p.79 */ { BIT2 ext_type, /* Must be '11'B */ BIT1 s_bit, BIT1 r_ts_bit, BIT1 tsc_bit, BIT1 i_bit, BIT1 ip_bit, BIT1 rtp_bit, Inner_IP_flags inner_ip_flags optional, Outer_IP_flags outer_ip_flags optional, LIN1 sn optional, integer ts optional, /* This field contains the length of the SDVL encoded TS value counted in octets. */ integer ts_length optional, Inner_IP_fields inner_ip_hdr optional, LIN2_BO_LAST ip_id optional, Outer_IP_fields outer_ip_hdr optional, RTP_flags_fields rtp_fl_fi optional }; type union Profile1_Extension /* p.79 */ { Extension0 ext0, Extension1 ext1, Extension2 ext2, Extension3 ext3 }; //Profile2 type record Profile2_headers /* p.77 */ { Profile2_base_header base_header, Profile2_Extension ext optional, LIN2_BO_LAST ip_id_outer optional, octetstring ah_outer optional, LIN2_BO_LAST gre_cksum1 optional, LIN2_BO_LAST ip_id_inner optional, octetstring ah_inner optional, LIN2_BO_LAST gre_cksum2 optional, LIN2_BO_LAST udp_cksum optional }; type union Profile2_base_header { Profile2_IR_header ir, Profile2_IR_DYN_header ir_dyn, Profile1_R_0_header r_0, Profile1_R_0_CRC_header r_0_crc, Profile1_UO_0_header uo_0, Profile2_R_1_header r_1, Profile2_UO_1_header uo_1, Profile2_UOR_2_header uor_2 }; type union Profile2_Static_Chain_u { IPv4_Static ipv4_stat, IPv6_Static ipv6_stat, UDP_Static udp_stat }; type record Profile2_UDP_Dynamic { LIN2_BO_LAST cksum, LIN2_BO_LAST udp_sn }; type union Profile2_Dynamic_Chain_u { IPv4_Dynamic ipv4_dyn, IPv6_Dynamic ipv6_dyn, Profile2_UDP_Dynamic udp_dyn }; type record of Profile2_Static_Chain_u Profile2_Static_Chain; type record of Profile2_Dynamic_Chain_u Profile2_Dynamic_Chain; type record Profile2_IR_header { INT14b_BO_LAST cid, BIT7 type_ind, /* Must be '1111110'B */ BIT1 d, LIN1 profile, /* Must be 2 */ LIN1 crc, Profile2_Static_Chain stat_chain, Profile2_Dynamic_Chain dyn_chain optional }; type record Profile2_IR_DYN_header /* p.46 */ /* p.92 */ { INT14b_BO_LAST cid, BIT8 type_ind, /* Must be '11111000'B */ LIN1 profile, /* Must be 2 */ LIN1 crc, Profile2_Dynamic_Chain dyn_chain }; type record Profile2_R_1_header { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '10'B */ INT6b sn, BIT1 x_bit, INT7b ip_id }; type record Profile2_UO_1_header { INT14b_BO_LAST cid, BIT2 type_ind, /* Must be '10'B */ INT6b ip_id, INT5b sn, INT3b crc }; type record Profile2_UOR_2_header { INT14b_BO_LAST cid, BIT3 type_ind, /* Must be '110'B */ INT5b sn, BIT1 x_bit, INT7b crc }; type record Profile2_Inner_IP_flags { BIT1 tos, BIT1 ttl, BIT1 df, BIT1 pr, BIT1 ipx, BIT1 nbo, BIT1 rnd_bit, BIT1 reserved /* Must be '0'B */ }; type union Profile2_Extension { Profile2_Extension0 ext0, Profile2_Extension1 ext1, Profile2_Extension2 ext2, Profile2_Extension3 ext3 }; type record Profile2_Extension0 { BIT2 ext_type, /* Must be '00'B */ INT3b sn, INT3b ip_id } type record Profile2_Extension1 { BIT2 ext_type, /* Must be '01'B */ INT3b sn, INT11b_BO_LAST ip_id }; type record Profile2_Extension2 { BIT2 ext_type, /* Must be '10'B */ INT3b sn, INT11b_BO_LAST ip_id2, LIN1 ip_id }; type record Profile2_Extension3 { BIT2 ext_type, /* Must be '11'B */ BIT1 s_bit, INT2b mode, BIT1 i_bit, BIT1 ip_bit, BIT1 ip2_bit, Profile2_Inner_IP_flags inner_ip_flags optional, Outer_IP_flags outer_ip_flags optional, LIN1 sn optional, Inner_IP_fields inner_ip_hdr optional, LIN2_BO_LAST ip_id optional, Outer_IP_fields outer_ip_hdr optional }; //Profile4 type record Profile4_headers { Profile4_base_header base_header, Profile2_Extension ext optional, LIN2_BO_LAST ip_id_outer optional, octetstring ah_outer optional, LIN2_BO_LAST gre_cksum1 optional, LIN2_BO_LAST ip_id_inner optional, octetstring ah_inner optional, LIN2_BO_LAST gre_cksum2 optional, Profile4_Dynamic_Chain additional_IP optional }; type union Profile4_base_header { Profile4_IR_header ir, Profile4_IR_DYN_header ir_dyn, Profile1_R_0_header r_0, Profile1_R_0_CRC_header r_0_crc, Profile1_UO_0_header uo_0, Profile2_R_1_header r_1, Profile2_UO_1_header uo_1, Profile2_UOR_2_header uor_2 }; type union Profile4_Static_Chain_u { IPv4_Static ipv4_stat, IPv6_Static ipv6_stat }; type record Profile4_IPv4_Dynamic { LIN1 tos, LIN1 ttl, LIN2_BO_LAST identification, BIT1 df_bit, BIT1 rnd_bit, BIT1 nbo_bit, BIT1 sid_bit, BIT4 reserved, /* Must be '0000'B */ Enc_Type_0 genextheadlist }; type union Profile4_Dynamic_Chain_u { Profile4_IPv4_Dynamic ipv4_dyn, IPv6_Dynamic ipv6_dyn, LIN2_BO_LAST sn }; type record of Profile4_Static_Chain_u Profile4_Static_Chain; type record of Profile4_Dynamic_Chain_u Profile4_Dynamic_Chain; type record Profile4_IR_header { INT14b_BO_LAST cid, BIT7 type_ind, /* Must be '1111110'B */ BIT1 d, LIN1 profile, /* Must be 4 */ LIN1 crc, Profile4_Static_Chain stat_chain, Profile4_Dynamic_Chain dyn_chain optional }; type record Profile4_IR_DYN_header { INT14b_BO_LAST cid, BIT8 type_ind, /* Must be '11111000'B */ LIN1 profile, /* Must be 4 */ LIN1 crc, Profile4_Dynamic_Chain dyn_chain }; } with { encode "RAW" }