: EOPNOTSUPP);
}
+int
+ct_dpif_set_limits(struct dpif *dpif, const uint32_t *default_limit,
+ const struct ovs_list *zone_limits)
+{
+ return (dpif->dpif_class->ct_set_limits
+ ? dpif->dpif_class->ct_set_limits(dpif, default_limit,
+ zone_limits)
+ : EOPNOTSUPP);
+}
+
+int
+ct_dpif_get_limits(struct dpif *dpif, uint32_t *default_limit,
+ const struct ovs_list *zone_limits_in,
+ struct ovs_list *zone_limits_out)
+{
+ return (dpif->dpif_class->ct_get_limits
+ ? dpif->dpif_class->ct_get_limits(dpif, default_limit,
+ zone_limits_in,
+ zone_limits_out)
+ : EOPNOTSUPP);
+}
+
+int
+ct_dpif_del_limits(struct dpif *dpif, const struct ovs_list *zone_limits)
+{
+ return (dpif->dpif_class->ct_del_limits
+ ? dpif->dpif_class->ct_del_limits(dpif, zone_limits)
+ : EOPNOTSUPP);
+}
+
void
ct_dpif_entry_uninit(struct ct_dpif_entry *entry)
{
struct dpif *dpif;
};
+struct ct_dpif_zone_limit {
+ uint16_t zone;
+ uint32_t limit; /* Limit on number of entries. */
+ uint32_t count; /* Current number of entries. */
+ struct ovs_list node;
+};
+
int ct_dpif_dump_start(struct dpif *, struct ct_dpif_dump_state **,
const uint16_t *zone, int *);
int ct_dpif_dump_next(struct ct_dpif_dump_state *, struct ct_dpif_entry *);
int ct_dpif_set_maxconns(struct dpif *dpif, uint32_t maxconns);
int ct_dpif_get_maxconns(struct dpif *dpif, uint32_t *maxconns);
int ct_dpif_get_nconns(struct dpif *dpif, uint32_t *nconns);
+int ct_dpif_set_limits(struct dpif *dpif, const uint32_t *default_limit,
+ const struct ovs_list *);
+int ct_dpif_get_limits(struct dpif *dpif, uint32_t *default_limit,
+ const struct ovs_list *, struct ovs_list *);
+int ct_dpif_del_limits(struct dpif *dpif, const struct ovs_list *);
void ct_dpif_entry_uninit(struct ct_dpif_entry *);
void ct_dpif_format_entry(const struct ct_dpif_entry *, struct ds *,
bool verbose, bool print_stats);
dpif_netdev_ct_set_maxconns,
dpif_netdev_ct_get_maxconns,
dpif_netdev_ct_get_nconns,
+ NULL, /* ct_set_limits */
+ NULL, /* ct_get_limits */
+ NULL, /* ct_del_limits */
dpif_netdev_meter_get_features,
dpif_netdev_meter_set,
dpif_netdev_meter_get,
NULL, /* ct_set_maxconns */
NULL, /* ct_get_maxconns */
NULL, /* ct_get_nconns */
+ NULL, /* ct_set_limits */
+ NULL, /* ct_get_limits */
+ NULL, /* ct_del_limits */
dpif_netlink_meter_get_features,
dpif_netlink_meter_set,
dpif_netlink_meter_get,
/* Get number of connections tracked. */
int (*ct_get_nconns)(struct dpif *, uint32_t *nconns);
+ /* Connection tracking per zone limit */
+
+ /* Per zone conntrack limit sets the maximum allowed connections in zones
+ * to provide resource isolation. If a per zone limit for a particular
+ * zone is not available in the datapath, it defaults to the default
+ * per zone limit. Initially, the default per zone limit is
+ * unlimited (0). */
+
+ /* Sets the max connections allowed per zone according to 'zone_limits',
+ * a list of 'struct ct_dpif_zone_limit' entries (the 'count' member
+ * is not used when setting limits). If 'default_limit' is not NULL,
+ * modifies the default limit to '*default_limit'. */
+ int (*ct_set_limits)(struct dpif *, const uint32_t *default_limit,
+ const struct ovs_list *zone_limits);
+
+ /* Looks up the default per zone limit and stores that in
+ * 'default_limit'. Look up the per zone limits for all zones in
+ * the 'zone_limits_in' list of 'struct ct_dpif_zone_limit' entries
+ * (the 'limit' and 'count' members are not used), and stores the
+ * reply that includes the zone, the per zone limit, and the number
+ * of connections in the zone into 'zone_limits_out' list. */
+ int (*ct_get_limits)(struct dpif *, uint32_t *default_limit,
+ const struct ovs_list *zone_limits_in,
+ struct ovs_list *zone_limits_out);
+
+ /* Deletes per zone limit of all zones specified in 'zone_limits', a
+ * list of 'struct ct_dpif_zone_limit' entries. */
+ int (*ct_del_limits)(struct dpif *, const struct ovs_list *zone_limits);
+
/* Meters */
/* Queries 'dpif' for supported meter features.