- /* Register with IP for header parsing */
- pi = ip_get_protocol_info (im, IP_PROTOCOL_SCTP);
- if (pi == 0)
- return clib_error_return (0, "SCTP protocol info AWOL");
- pi->format_header = format_sctp_header;
- pi->unformat_pg_edit = unformat_pg_sctp_header;
+ if (!sm->is_init && is_en)
+ {
+ node = vlib_get_node_by_name (vm, (u8 *) "sctp4-established");
+ sm->sctp4_established_phase_node_index = node->index;
+
+ node = vlib_get_node_by_name (vm, (u8 *) "sctp6-established");
+ sm->sctp6_established_phase_node_index = node->index;
+
+ sm->is_init = 1;
+
+ /* Register with IP for header parsing */
+ pi = ip_get_protocol_info (im, IP_PROTOCOL_SCTP);
+ if (pi == 0)
+ return clib_error_return (0, "SCTP protocol info AWOL");
+ pi->format_header = format_sctp_header;
+ pi->unformat_pg_edit = unformat_pg_sctp_header;
+
+ /* Register as transport with session layer */
+ transport_register_protocol (TRANSPORT_PROTO_SCTP, &sctp_proto,
+ FIB_PROTOCOL_IP4, sctp4_output_node.index);
+ transport_register_protocol (TRANSPORT_PROTO_SCTP, &sctp_proto,
+ FIB_PROTOCOL_IP6, sctp6_output_node.index);
+ }
+
+ sctp_transport_enable_disable (vm, is_en);
+ return 0;
+}
+
+clib_error_t *
+sctp_init (vlib_main_t * vm)
+{
+ sctp_main_t *sm = vnet_get_sctp_main ();