X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-provider.h;h=7f1b110fad1f924dd9c2fdccc97d3e807bc59882;hb=5a2dfd473a65a041356971771c99e4a9d04b3f9c;hp=b1c697223b864e040177ddbed0c1bb85668d1d86;hpb=308881afb61e292c629b36a357cfc37153884000;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index b1c697223..7f1b110fa 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -26,6 +26,8 @@ #include "shash.h" #include "timeval.h" +struct ofputil_flow_mod; + /* An OpenFlow switch. * * With few exceptions, ofproto implementations may look at these fields but @@ -49,6 +51,7 @@ struct ofproto { char *sw_desc; /* Software version. */ char *serial_desc; /* Serial number. */ char *dp_desc; /* Datapath description. */ + enum ofp_config_flags frag_handling; /* One of OFPC_*. */ /* Datapath. */ struct hmap ports; /* Contains "struct ofport"s. */ @@ -79,7 +82,6 @@ struct ofport *ofproto_get_port(const struct ofproto *, uint16_t ofp_port); (CLS) < &(OFPROTO)->tables[(OFPROTO)->n_tables]; \ (CLS)++) - /* An OpenFlow port within a "struct ofproto". * * With few exceptions, ofproto implementations may look at these fields but @@ -91,8 +93,11 @@ struct ofport { struct ofp_phy_port opp; uint16_t ofp_port; /* OpenFlow port number. */ unsigned int change_seq; + int mtu; }; +void ofproto_port_set_state(struct ofport *, ovs_be32 state); + /* An OpenFlow flow within a "struct ofproto". * * With few exceptions, ofproto implementations may look at these fields but @@ -804,14 +809,36 @@ struct ofproto_class { * rule. */ void (*rule_modify_actions)(struct rule *rule); - /* These functions implement the OpenFlow IP fragment handling policy. By - * default ('drop_frags' == false), an OpenFlow switch should treat IP - * fragments the same way as other packets (although TCP and UDP port - * numbers cannot be determined). With 'drop_frags' == true, the switch - * should drop all IP fragments without passing them through the flow - * table. */ - bool (*get_drop_frags)(struct ofproto *ofproto); - void (*set_drop_frags)(struct ofproto *ofproto, bool drop_frags); + /* Changes the OpenFlow IP fragment handling policy to 'frag_handling', + * which takes one of the following values, with the corresponding + * meanings: + * + * - OFPC_FRAG_NORMAL: The switch should treat IP fragments the same way + * as other packets, omitting TCP and UDP port numbers (always setting + * them to 0). + * + * - OFPC_FRAG_DROP: The switch should drop all IP fragments without + * passing them through the flow table. + * + * - OFPC_FRAG_REASM: The switch should reassemble IP fragments before + * passing packets through the flow table. + * + * - OFPC_FRAG_NX_MATCH (a Nicira extension): Similar to OFPC_FRAG_NORMAL, + * except that TCP and UDP port numbers should be included in fragments + * with offset 0. + * + * Implementations are not required to support every mode. + * OFPC_FRAG_NORMAL is the default mode when an ofproto is created. + * + * At the time of the call to ->set_frag_handling(), the current mode is + * available in 'ofproto->frag_handling'. ->set_frag_handling() returns + * true if the requested mode was set, false if it is not supported. + * + * Upon successful return, the caller changes 'ofproto->frag_handling' to + * reflect the new mode. + */ + bool (*set_frag_handling)(struct ofproto *ofproto, + enum ofp_config_flags frag_handling); /* Implements the OpenFlow OFPT_PACKET_OUT command. The datapath should * execute the 'n_actions' in the 'actions' array on 'packet'. @@ -945,7 +972,7 @@ struct ofproto_class { /* Returns true if 'aux' is a registered bundle that is currently in use as * the output for a mirror. */ - bool (*is_mirror_output_bundle)(struct ofproto *ofproto, void *aux); + bool (*is_mirror_output_bundle)(const struct ofproto *ofproto, void *aux); /* When the configuration option of forward_bpdu changes, this function * will be invoked. */ @@ -957,6 +984,18 @@ extern const struct ofproto_class ofproto_dpif_class; int ofproto_class_register(const struct ofproto_class *); int ofproto_class_unregister(const struct ofproto_class *); +/* ofproto_flow_mod() returns this value if the flow_mod could not be processed + * because it overlaps with an ongoing flow table operation that has not yet + * completed. The caller should retry the operation later. + * + * ofproto.c also uses this value internally for additional (similar) purposes. + * + * This particular value is a good choice because it is negative (so it won't + * collide with any errno value or any value returned by ofp_mkerr()) and large + * (so it won't accidentally collide with EOF or a negative errno value). */ +enum { OFPROTO_POSTPONE = -100000 }; + +int ofproto_flow_mod(struct ofproto *, const struct ofputil_flow_mod *); void ofproto_add_flow(struct ofproto *, const struct cls_rule *, const union ofp_action *, size_t n_actions); bool ofproto_delete_flow(struct ofproto *, const struct cls_rule *);