+static clib_error_t *
+vnet_feature_add_del_sw_interface (vnet_main_t * vnm, u32 sw_if_index,
+ u32 is_add)
+{
+ vnet_feature_main_t *fm = &feature_main;
+ const vnet_feature_arc_registration_t *far;
+
+ if (is_add)
+ return 0;
+
+ /*
+ * remove all enabled features from an interface on deletion
+ */
+ for (far = fm->next_arc; far != 0; far = far->next)
+ {
+ const u8 arc_index = far->feature_arc_index;
+ vnet_feature_config_main_t *cm =
+ vec_elt_at_index (fm->feature_config_mains, arc_index);
+ const u32 ci =
+ vec_len (cm->config_index_by_sw_if_index) <=
+ sw_if_index ? ~0 : vec_elt (cm->config_index_by_sw_if_index,
+ sw_if_index);
+
+ if (~0 == ci)
+ continue;
+
+ fm->sw_if_index_has_features[arc_index] =
+ clib_bitmap_set (fm->sw_if_index_has_features[arc_index], sw_if_index,
+ 0);
+
+ vnet_feature_reg_invoke (sw_if_index, arc_index, 0);
+
+ if (vec_len (fm->feature_count_by_sw_if_index[arc_index]) > sw_if_index)
+ vec_elt (fm->feature_count_by_sw_if_index[arc_index], sw_if_index) =
+ 0;
+
+ vec_elt (cm->config_index_by_sw_if_index, sw_if_index) = ~0;
+ vnet_config_del (&cm->config_main, ci);
+ }
+
+ return 0;
+}
+
+VNET_SW_INTERFACE_ADD_DEL_FUNCTION_PRIO (vnet_feature_add_del_sw_interface,
+ VNET_ITF_FUNC_PRIORITY_HIGH);
+