+ /* Consistency checks */
+
+ /* Enable w/ capture already enabled not allowed */
+ if ((pp->pcap_rx_enable + pp->pcap_tx_enable + pp->pcap_drop_enable)
+ && (a->rx_enable + a->tx_enable + a->drop_enable))
+ return VNET_API_ERROR_INVALID_VALUE;
+
+ /* Disable capture with capture already disabled, not interesting */
+ if (((pp->pcap_rx_enable + pp->pcap_tx_enable + pp->pcap_drop_enable) == 0)
+ && ((a->rx_enable + a->tx_enable + a->drop_enable == 0)))
+ return VNET_API_ERROR_VALUE_EXIST;
+
+ /* Change number of packets to capture while capturing */
+ if ((pp->pcap_rx_enable + pp->pcap_tx_enable + pp->pcap_drop_enable)
+ && (a->rx_enable + a->tx_enable + a->drop_enable)
+ && (pm->n_packets_to_capture != a->packets_to_capture))
+ return VNET_API_ERROR_INVALID_VALUE_2;
+
+ set = pool_elt_at_index (cm->filter_sets, cm->filter_set_by_sw_if_index[0]);
+
+ /* Classify filter specified, but no classify filter configured */
+ if ((a->rx_enable + a->tx_enable + a->drop_enable) && a->filter &&
+ (set->table_indices[0] == ~0))
+ return VNET_API_ERROR_NO_SUCH_LABEL;
+
+ if (a->rx_enable + a->tx_enable + a->drop_enable)
+ {
+ /* Sanity check max bytes per pkt */
+ if (a->max_bytes_per_pkt < 32 || a->max_bytes_per_pkt > 9000)
+ return VNET_API_ERROR_INVALID_MEMORY_SIZE;
+
+ /* Clean up from previous run, if any */
+ vec_free (pm->file_name);
+ vec_free (pm->pcap_data);
+ memset (pm, 0, sizeof (*pm));
+
+ vec_validate_aligned (vnet_trace_dummy, 2048, CLIB_CACHE_LINE_BYTES);
+ if (pm->lock == 0)
+ clib_spinlock_init (&(pm->lock));
+
+ if (a->filename == 0)