LCOV - code coverage report
Current view: top level - ofproto - ofproto-dpif.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 16 16 100.0 %
Date: 2016-09-14 01:02:56 Functions: 5 5 100.0 %
Branches: 3 6 50.0 %

           Branch data     Line data    Source code
       1                 :            : /* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
       2                 :            :  *
       3                 :            :  * Licensed under the Apache License, Version 2.0 (the "License");
       4                 :            :  * you may not use this file except in compliance with the License.
       5                 :            :  * You may obtain a copy of the License at:
       6                 :            :  *
       7                 :            :  *     http://www.apache.org/licenses/LICENSE-2.0
       8                 :            :  *
       9                 :            :  * Unless required by applicable law or agreed to in writing, software
      10                 :            :  * distributed under the License is distributed on an "AS IS" BASIS,
      11                 :            :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12                 :            :  * See the License for the specific language governing permissions and
      13                 :            :  * limitations under the License. */
      14                 :            : 
      15                 :            : #ifndef OFPROTO_DPIF_H
      16                 :            : #define OFPROTO_DPIF_H 1
      17                 :            : 
      18                 :            : #include <stdint.h>
      19                 :            : 
      20                 :            : #include "fail-open.h"
      21                 :            : #include "hmapx.h"
      22                 :            : #include "odp-util.h"
      23                 :            : #include "openvswitch/ofp-util.h"
      24                 :            : #include "ovs-thread.h"
      25                 :            : #include "ofproto-provider.h"
      26                 :            : #include "timer.h"
      27                 :            : #include "util.h"
      28                 :            : #include "ovs-thread.h"
      29                 :            : 
      30                 :            : /* Priority for internal rules created to handle recirculation */
      31                 :            : #define RECIRC_RULE_PRIORITY 20
      32                 :            : 
      33                 :            : union user_action_cookie;
      34                 :            : struct dpif_flow_stats;
      35                 :            : struct ofproto;
      36                 :            : struct ofproto_async_msg;
      37                 :            : struct ofproto_dpif;
      38                 :            : struct ofport_dpif;
      39                 :            : struct dpif_backer;
      40                 :            : struct OVS_LOCKABLE rule_dpif;
      41                 :            : struct OVS_LOCKABLE group_dpif;
      42                 :            : 
      43                 :            : /* Number of implemented OpenFlow tables. */
      44                 :            : enum { N_TABLES = 255 };
      45                 :            : enum { TBL_INTERNAL = N_TABLES - 1 };    /* Used for internal hidden rules. */
      46                 :            : BUILD_ASSERT_DECL(N_TABLES >= 2 && N_TABLES <= 255);
      47                 :            : 
      48                 :            : /* Ofproto-dpif -- DPIF based ofproto implementation.
      49                 :            :  *
      50                 :            :  * Ofproto-dpif provides an ofproto implementation for those platforms which
      51                 :            :  * implement the netdev and dpif interface defined in netdev.h and dpif.h.  The
      52                 :            :  * most important of which is the Linux Kernel Module (dpif-linux), but
      53                 :            :  * alternatives are supported such as a userspace only implementation
      54                 :            :  * (dpif-netdev), and a dummy implementation used for unit testing.
      55                 :            :  *
      56                 :            :  * Ofproto-dpif is divided into three major chunks.
      57                 :            :  *
      58                 :            :  * - ofproto-dpif.c
      59                 :            :  *   The main ofproto-dpif module is responsible for implementing the
      60                 :            :  *   provider interface, installing and removing datapath flows, maintaining
      61                 :            :  *   packet statistics, running protocols (BFD, LACP, STP, etc), and
      62                 :            :  *   configuring relevant submodules.
      63                 :            :  *
      64                 :            :  * - ofproto-dpif-upcall.c
      65                 :            :  *   Ofproto-dpif-upcall is responsible for retrieving upcalls from the kernel,
      66                 :            :  *   processing miss upcalls, and handing more complex ones up to the main
      67                 :            :  *   ofproto-dpif module.  Miss upcall processing boils down to figuring out
      68                 :            :  *   what each packet's actions are, executing them (i.e. asking the kernel to
      69                 :            :  *   forward it), and handing it up to ofproto-dpif to decided whether or not
      70                 :            :  *   to install a kernel flow.
      71                 :            :  *
      72                 :            :  * - ofproto-dpif-xlate.c
      73                 :            :  *   Ofproto-dpif-xlate is responsible for translating OpenFlow actions into
      74                 :            :  *   datapath actions. */
      75                 :            : 
      76                 :            : /* Stores the various features which the corresponding backer supports. */
      77                 :            : struct dpif_backer_support {
      78                 :            :     /* True if the datapath supports variable-length
      79                 :            :      * OVS_USERSPACE_ATTR_USERDATA in OVS_ACTION_ATTR_USERSPACE actions.
      80                 :            :      * False if the datapath supports only 8-byte (or shorter) userdata. */
      81                 :            :     bool variable_length_userdata;
      82                 :            : 
      83                 :            :     /* True if the datapath supports masked data in OVS_ACTION_ATTR_SET
      84                 :            :      * actions. */
      85                 :            :     bool masked_set_action;
      86                 :            : 
      87                 :            :     /* True if the datapath supports tnl_push and pop actions. */
      88                 :            :     bool tnl_push_pop;
      89                 :            : 
      90                 :            :     /* True if the datapath supports OVS_FLOW_ATTR_UFID. */
      91                 :            :     bool ufid;
      92                 :            : 
      93                 :            :     /* True if the datapath supports OVS_ACTION_ATTR_TRUNC action. */
      94                 :            :     bool trunc;
      95                 :            : 
      96                 :            :     /* Each member represents support for related OVS_KEY_ATTR_* fields. */
      97                 :            :     struct odp_support odp;
      98                 :            : };
      99                 :            : 
     100                 :            : bool ofproto_dpif_get_enable_ufid(const struct dpif_backer *backer);
     101                 :            : struct dpif_backer_support *ofproto_dpif_get_support(const struct ofproto_dpif *);
     102                 :            : 
     103                 :            : ovs_version_t ofproto_dpif_get_tables_version(struct ofproto_dpif *);
     104                 :            : 
     105                 :            : struct rule_dpif *rule_dpif_lookup_from_table(struct ofproto_dpif *,
     106                 :            :                                               ovs_version_t, struct flow *,
     107                 :            :                                               struct flow_wildcards *,
     108                 :            :                                               const struct dpif_flow_stats *,
     109                 :            :                                               uint8_t *table_id,
     110                 :            :                                               ofp_port_t in_port,
     111                 :            :                                               bool may_packet_in,
     112                 :            :                                               bool honor_table_miss);
     113                 :            : 
     114                 :            : static inline void rule_dpif_ref(struct rule_dpif *);
     115                 :            : static inline void rule_dpif_unref(struct rule_dpif *);
     116                 :            : 
     117                 :            : void rule_dpif_credit_stats(struct rule_dpif *rule ,
     118                 :            :                             const struct dpif_flow_stats *);
     119                 :            : 
     120                 :            : static inline bool rule_dpif_is_fail_open(const struct rule_dpif *);
     121                 :            : static inline bool rule_dpif_is_table_miss(const struct rule_dpif *);
     122                 :            : static inline bool rule_dpif_is_internal(const struct rule_dpif *);
     123                 :            : 
     124                 :            : uint8_t rule_dpif_get_table(const struct rule_dpif *);
     125                 :            : 
     126                 :            : bool table_is_internal(uint8_t table_id);
     127                 :            : 
     128                 :            : const struct rule_actions *rule_dpif_get_actions(const struct rule_dpif *);
     129                 :            : void rule_set_recirc_id(struct rule *, uint32_t id);
     130                 :            : 
     131                 :            : ovs_be64 rule_dpif_get_flow_cookie(const struct rule_dpif *rule);
     132                 :            : 
     133                 :            : void rule_dpif_reduce_timeouts(struct rule_dpif *rule, uint16_t idle_timeout,
     134                 :            :                                uint16_t hard_timeout);
     135                 :            : 
     136                 :            : void group_dpif_credit_stats(struct group_dpif *,
     137                 :            :                              struct ofputil_bucket *,
     138                 :            :                              const struct dpif_flow_stats *);
     139                 :            : struct group_dpif *group_dpif_lookup(struct ofproto_dpif *ofproto,
     140                 :            :                                      uint32_t group_id, ovs_version_t version,
     141                 :            :                                      bool take_ref);
     142                 :            : const struct ovs_list *group_dpif_get_buckets(const struct group_dpif *group);
     143                 :            : 
     144                 :            : enum ofp11_group_type group_dpif_get_type(const struct group_dpif *group);
     145                 :            : const char *group_dpif_get_selection_method(const struct group_dpif *group);
     146                 :            : uint64_t group_dpif_get_selection_method_param(const struct group_dpif *group);
     147                 :            : const struct field_array *group_dpif_get_fields(const struct group_dpif *group);
     148                 :            : 
     149                 :            : int ofproto_dpif_execute_actions(struct ofproto_dpif *, const struct flow *,
     150                 :            :                                  struct rule_dpif *, const struct ofpact *,
     151                 :            :                                  size_t ofpacts_len, struct dp_packet *);
     152                 :            : int ofproto_dpif_execute_actions__(struct ofproto_dpif *, const struct flow *,
     153                 :            :                                    struct rule_dpif *, const struct ofpact *,
     154                 :            :                                    size_t ofpacts_len, int indentation,
     155                 :            :                                    int depth, int resubmits,
     156                 :            :                                    struct dp_packet *);
     157                 :            : void ofproto_dpif_send_async_msg(struct ofproto_dpif *,
     158                 :            :                                  struct ofproto_async_msg *);
     159                 :            : bool ofproto_dpif_wants_packet_in_on_miss(struct ofproto_dpif *);
     160                 :            : int ofproto_dpif_send_packet(const struct ofport_dpif *, bool oam,
     161                 :            :                              struct dp_packet *);
     162                 :            : void ofproto_dpif_flow_mod(struct ofproto_dpif *,
     163                 :            :                            const struct ofputil_flow_mod *);
     164                 :            : 
     165                 :            : struct ofport_dpif *odp_port_to_ofport(const struct dpif_backer *, odp_port_t);
     166                 :            : struct ofport_dpif *ofp_port_to_ofport(const struct ofproto_dpif *,
     167                 :            :                                        ofp_port_t);
     168                 :            : 
     169                 :            : bool ofproto_dpif_backer_enabled(struct dpif_backer* backer);
     170                 :            : 
     171                 :            : int ofproto_dpif_add_internal_flow(struct ofproto_dpif *,
     172                 :            :                                    const struct match *, int priority,
     173                 :            :                                    uint16_t idle_timeout,
     174                 :            :                                    const struct ofpbuf *ofpacts,
     175                 :            :                                    struct rule **rulep);
     176                 :            : int ofproto_dpif_delete_internal_flow(struct ofproto_dpif *, struct match *,
     177                 :            :                                       int priority);
     178                 :            : 
     179                 :            : const struct uuid *ofproto_dpif_get_uuid(const struct ofproto_dpif *);
     180                 :            : 
     181                 :            : /* struct rule_dpif has struct rule as it's first member. */
     182                 :            : #define RULE_CAST(RULE) ((struct rule *)RULE)
     183                 :            : #define GROUP_CAST(GROUP) ((struct ofgroup *)GROUP)
     184                 :            : 
     185                 :            : static inline struct group_dpif* group_dpif_ref(struct group_dpif *group)
     186                 :            : {
     187                 :            :     if (group) {
     188                 :            :         ofproto_group_ref(GROUP_CAST(group));
     189                 :            :     }
     190                 :            :     return group;
     191                 :            : }
     192                 :            : 
     193                 :         50 : static inline void group_dpif_unref(struct group_dpif *group)
     194                 :            : {
     195         [ +  - ]:         50 :     if (group) {
     196                 :         50 :         ofproto_group_unref(GROUP_CAST(group));
     197                 :            :     }
     198                 :         50 : }
     199                 :            : 
     200                 :    1139820 : static inline void rule_dpif_ref(struct rule_dpif *rule)
     201                 :            : {
     202         [ +  - ]:    1139820 :     if (rule) {
     203                 :    1139820 :         ofproto_rule_ref(RULE_CAST(rule));
     204                 :            :     }
     205                 :    1139820 : }
     206                 :            : 
     207                 :    1139801 : static inline void rule_dpif_unref(struct rule_dpif *rule)
     208                 :            : {
     209         [ +  - ]:    1139801 :     if (rule) {
     210                 :    1139801 :         ofproto_rule_unref(RULE_CAST(rule));
     211                 :            :     }
     212                 :    1139801 : }
     213                 :            : 
     214                 :            : static inline bool rule_dpif_is_fail_open(const struct rule_dpif *rule)
     215                 :            : {
     216                 :            :     return is_fail_open_rule(RULE_CAST(rule));
     217                 :            : }
     218                 :            : 
     219                 :        680 : static inline bool rule_dpif_is_table_miss(const struct rule_dpif *rule)
     220                 :            : {
     221                 :        680 :     return rule_is_table_miss(RULE_CAST(rule));
     222                 :            : }
     223                 :            : 
     224                 :            : /* Returns true if 'rule' is an internal rule, false otherwise. */
     225                 :    1176903 : static inline bool rule_dpif_is_internal(const struct rule_dpif *rule)
     226                 :            : {
     227                 :    1176903 :     return RULE_CAST(rule)->table_id == TBL_INTERNAL;
     228                 :            : }
     229                 :            : 
     230                 :            : #undef RULE_CAST
     231                 :            : 
     232                 :            : bool ovs_native_tunneling_is_on(struct ofproto_dpif *ofproto);
     233                 :            : #endif /* ofproto-dpif.h */

Generated by: LCOV version 1.12