X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto.h;h=5a99d46929e2f932ea8d6c105883bc0abc49ce6d;hb=e29749d571b1e23ef8512c1da3407f2451df0ee3;hp=125e977f9f18c52e89597aa6071f40094ef28a9f;hpb=93b8df3853659238df58b1e1e69a0c5608e208f8;p=sliver-openvswitch.git diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h index 125e977f9..5a99d4692 100644 --- a/ofproto/ofproto.h +++ b/ofproto/ofproto.h @@ -22,16 +22,18 @@ #include #include #include +#include "cfm.h" #include "flow.h" #include "netflow.h" #include "sset.h" +#include "stp.h" #include "tag.h" #ifdef __cplusplus extern "C" { #endif -struct cfm; +struct cfm_settings; struct cls_rule; struct netdev; struct ofproto; @@ -64,6 +66,39 @@ struct ofproto_sflow_options { char *control_ip; }; +struct ofproto_stp_settings { + stp_identifier system_id; + uint16_t priority; + uint16_t hello_time; + uint16_t max_age; + uint16_t fwd_delay; +}; + +struct ofproto_stp_status { + bool enabled; /* If false, ignore other members. */ + stp_identifier bridge_id; + stp_identifier designated_root; + int root_path_cost; +}; + +struct ofproto_port_stp_settings { + bool enable; + uint8_t port_num; /* In the range 1-255, inclusive. */ + uint8_t priority; + uint16_t path_cost; +}; + +struct ofproto_port_stp_status { + bool enabled; /* If false, ignore other members. */ + int port_id; + enum stp_state state; + unsigned int sec_in_state; + enum stp_role role; + int tx_count; /* Number of BPDUs transmitted. */ + int rx_count; /* Number of valid BPDUs received. */ + int error_count; /* Number of bad BPDUs received. */ +}; + /* How the switch should act if the controller cannot be contacted. */ enum ofproto_fail_mode { OFPROTO_FAIL_SECURE, /* Preserve flow table. */ @@ -141,6 +176,9 @@ int ofproto_port_dump_done(struct ofproto_port_dump *); : (ofproto_port_dump_done(DUMP), false)); \ ) +#define OFPROTO_FLOW_EVICTON_THRESHOLD_DEFAULT 1000 +#define OFPROTO_FLOW_EVICTION_THRESHOLD_MIN 100 + int ofproto_port_add(struct ofproto *, struct netdev *, uint16_t *ofp_portp); int ofproto_port_del(struct ofproto *, uint16_t ofp_port); @@ -156,6 +194,8 @@ void ofproto_reconnect_controllers(struct ofproto *); void ofproto_set_extra_in_band_remotes(struct ofproto *, const struct sockaddr_in *, size_t n); void ofproto_set_in_band_queue(struct ofproto *, int queue_id); +void ofproto_set_flow_eviction_threshold(struct ofproto *, unsigned threshold); +void ofproto_set_forward_bpdu(struct ofproto *, bool forward_bpdu); void ofproto_set_desc(struct ofproto *, const char *mfr_desc, const char *hw_desc, const char *sw_desc, const char *serial_desc, @@ -164,6 +204,8 @@ int ofproto_set_snoops(struct ofproto *, const struct sset *snoops); int ofproto_set_netflow(struct ofproto *, const struct netflow_options *nf_options); int ofproto_set_sflow(struct ofproto *, const struct ofproto_sflow_options *); +int ofproto_set_stp(struct ofproto *, const struct ofproto_stp_settings *); +int ofproto_get_stp_status(struct ofproto *, struct ofproto_stp_status *); /* Configuration of ports. */ @@ -171,9 +213,33 @@ void ofproto_port_unregister(struct ofproto *, uint16_t ofp_port); void ofproto_port_clear_cfm(struct ofproto *, uint16_t ofp_port); void ofproto_port_set_cfm(struct ofproto *, uint16_t ofp_port, - const struct cfm *, uint16_t remote_mpid); -const struct cfm *ofproto_port_get_cfm(struct ofproto *, uint16_t ofp_port); + const struct cfm_settings *); int ofproto_port_is_lacp_current(struct ofproto *, uint16_t ofp_port); +int ofproto_port_set_stp(struct ofproto *, uint16_t ofp_port, + const struct ofproto_port_stp_settings *); +int ofproto_port_get_stp_status(struct ofproto *, uint16_t ofp_port, + struct ofproto_port_stp_status *); + +/* The behaviour of the port regarding VLAN handling */ +enum port_vlan_mode { + /* This port is an access port. 'vlan' is the VLAN ID. 'trunks' is + * ignored. */ + PORT_VLAN_ACCESS, + + /* This port is a trunk. 'trunks' is the set of trunks. 'vlan' is + * ignored. */ + PORT_VLAN_TRUNK, + + /* Untagged incoming packets are part of 'vlan', as are incoming packets + * tagged with 'vlan'. Outgoing packets tagged with 'vlan' stay tagged. + * Other VLANs in 'trunks' are trunked. */ + PORT_VLAN_NATIVE_TAGGED, + + /* Untagged incoming packets are part of 'vlan', as are incoming packets + * tagged with 'vlan'. Outgoing packets tagged with 'vlan' are untagged. + * Other VLANs in 'trunks' are trunked. */ + PORT_VLAN_NATIVE_UNTAGGED +}; /* Configuration of bundles. */ struct ofproto_bundle_settings { @@ -182,8 +248,10 @@ struct ofproto_bundle_settings { uint16_t *slaves; /* OpenFlow port numbers for slaves. */ size_t n_slaves; - int vlan; /* VLAN if access port, -1 if trunk port. */ - unsigned long *trunks; /* vlan_bitmap, NULL to trunk all VLANs. */ + enum port_vlan_mode vlan_mode; /* Selects mode for vlan and trunks */ + int vlan; /* VLAN VID, except for PORT_VLAN_TRUNK. */ + unsigned long *trunks; /* vlan_bitmap, except for PORT_VLAN_ACCESS. */ + bool use_priority_tags; /* Use 802.1p tag for frames in VLAN 0? */ struct bond_settings *bond; /* Must be nonnull iff if n_slaves > 1. */ uint32_t *bond_stable_ids; /* Array of n_slaves elements. */ @@ -222,7 +290,7 @@ int ofproto_mirror_register(struct ofproto *, void *aux, int ofproto_mirror_unregister(struct ofproto *, void *aux); int ofproto_set_flood_vlans(struct ofproto *, unsigned long *flood_vlans); -bool ofproto_is_mirror_output_bundle(struct ofproto *, void *aux); +bool ofproto_is_mirror_output_bundle(const struct ofproto *, void *aux); /* Configuration querying. */ bool ofproto_has_snoops(const struct ofproto *); @@ -230,6 +298,10 @@ void ofproto_get_snoops(const struct ofproto *, struct sset *); void ofproto_get_all_flows(struct ofproto *p, struct ds *); void ofproto_get_netflow_ids(const struct ofproto *, uint8_t *engine_type, uint8_t *engine_id); +int ofproto_port_get_cfm_fault(const struct ofproto *, uint16_t ofp_port); +int ofproto_port_get_cfm_remote_mpids(const struct ofproto *, + uint16_t ofp_port, const uint64_t **rmps, + size_t *n_rmps); void ofproto_get_ofproto_controller_info(const struct ofproto *, struct shash *); void ofproto_free_ofproto_controller_info(struct shash *);