LCOV - code coverage report
Current view: top level - vnet/snap - snap.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 7 15 46.7 %
Date: 2023-10-26 01:39:38 Functions: 2 3 66.7 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2015 Cisco and/or its affiliates.
       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             : /*
      16             :  * snap.h: SNAP definitions
      17             :  *
      18             :  * Copyright (c) 2008 Eliot Dresselhaus
      19             :  *
      20             :  * Permission is hereby granted, free of charge, to any person obtaining
      21             :  * a copy of this software and associated documentation files (the
      22             :  * "Software"), to deal in the Software without restriction, including
      23             :  * without limitation the rights to use, copy, modify, merge, publish,
      24             :  * distribute, sublicense, and/or sell copies of the Software, and to
      25             :  * permit persons to whom the Software is furnished to do so, subject to
      26             :  * the following conditions:
      27             :  *
      28             :  * The above copyright notice and this permission notice shall be
      29             :  * included in all copies or substantial portions of the Software.
      30             :  *
      31             :  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
      32             :  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
      33             :  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
      34             :  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
      35             :  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
      36             :  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
      37             :  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      38             :  */
      39             : 
      40             : #ifndef included_snap_h
      41             : #define included_snap_h
      42             : 
      43             : #include <vnet/vnet.h>
      44             : 
      45             : #define foreach_ieee_oui                        \
      46             :   _ (0x000000, ethernet)                        \
      47             :   _ (0x00000c, cisco)
      48             : 
      49             : typedef enum
      50             : {
      51             : #define _(n,f) IEEE_OUI_##f = n,
      52             :   foreach_ieee_oui
      53             : #undef _
      54             : } ieee_oui_t;
      55             : 
      56             : #define foreach_snap_cisco_protocol             \
      57             :   _ (0x0102, drip)                              \
      58             :   _ (0x0104, port_aggregation_protocol)         \
      59             :   _ (0x0105, mls_hello)                         \
      60             :   _ (0x010b, per_vlan_spanning_tree)            \
      61             :   _ (0x010c, vlan_bridge)                       \
      62             :   _ (0x0111, unidirectional_link_detection)     \
      63             :   _ (0x2000, cdp)                               \
      64             :   _ (0x2001, cgmp)                              \
      65             :   _ (0x2003, vtp)                               \
      66             :   _ (0x2004, dtp)                               \
      67             :   _ (0x200a, stp_uplink_fast)
      68             : 
      69             : typedef enum
      70             : {
      71             : #define _(n,f) SNAP_cisco_##f = n,
      72             :   foreach_snap_cisco_protocol
      73             : #undef _
      74             : } snap_cisco_protocol_t;
      75             : 
      76             : typedef union
      77             : {
      78             :   /* *INDENT-OFF* */
      79             :   CLIB_PACKED (struct {
      80             :     /* OUI: organization unique identifier. */
      81             :     u8 oui[3];
      82             : 
      83             :     /* Per-OUI protocol. */
      84             :     u16 protocol;
      85             :   });
      86             :   /* *INDENT-ON* */
      87             : 
      88             :   u8 as_u8[5];
      89             : } snap_header_t;
      90             : 
      91             : typedef struct
      92             : {
      93             :   u32 oui;
      94             :   u32 protocol;
      95             : } snap_oui_and_protocol_t;
      96             : 
      97             : typedef struct
      98             : {
      99             :   /* Name vector string. */
     100             :   u8 *name;
     101             : 
     102             :   snap_oui_and_protocol_t oui_and_protocol;
     103             : 
     104             :   /* Node which handles this type. */
     105             :   u32 node_index;
     106             : 
     107             :   /* snap-input next index for this type. */
     108             :   u32 next_index;
     109             : } snap_protocol_info_t;
     110             : 
     111             : always_inline void
     112           0 : snap_header_set_protocol (snap_header_t * h, snap_oui_and_protocol_t * p)
     113             : {
     114           0 :   u16 protocol = p->protocol;
     115           0 :   u32 oui = p->oui;
     116           0 :   h->protocol = clib_host_to_net_u16 (protocol);
     117           0 :   h->oui[0] = (oui >> 16) & 0xff;
     118           0 :   h->oui[1] = (oui >> 8) & 0xff;
     119           0 :   h->oui[2] = (oui >> 0) & 0xff;
     120           0 : }
     121             : 
     122             : #define foreach_snap_error                      \
     123             :   _ (NONE, "no error")                                \
     124             :   _ (UNKNOWN_PROTOCOL, "unknown oui/snap protocol")
     125             : 
     126             : typedef enum
     127             : {
     128             : #define _(f,s) SNAP_ERROR_##f,
     129             :   foreach_snap_error
     130             : #undef _
     131             :     SNAP_N_ERROR,
     132             : } snap_error_t;
     133             : 
     134             : typedef struct
     135             : {
     136             :   vlib_main_t *vlib_main;
     137             : 
     138             :   /* Vector of known SNAP oui/protocol pairs. */
     139             :   snap_protocol_info_t *protocols;
     140             : 
     141             :   /* Hash table mapping oui/protocol to protocol index. */
     142             :   mhash_t protocol_hash;
     143             : 
     144             :   /* Hash table mapping protocol by name. */
     145             :   uword *protocol_info_by_name;
     146             : } snap_main_t;
     147             : 
     148             : always_inline u32
     149          14 : snap_header_get_oui (snap_header_t * h)
     150             : {
     151          14 :   return (h->oui[0] << 16) | (h->oui[1] << 8) | h->oui[2];
     152             : }
     153             : 
     154             : always_inline snap_protocol_info_t *
     155           8 : snap_get_protocol_info (snap_main_t * sm, snap_header_t * h)
     156             : {
     157             :   snap_oui_and_protocol_t key;
     158             :   uword *p;
     159             : 
     160           8 :   key.oui = snap_header_get_oui (h);
     161           8 :   key.protocol = h->protocol;
     162             : 
     163           8 :   p = mhash_get (&sm->protocol_hash, &key);
     164           8 :   return p ? vec_elt_at_index (sm->protocols, p[0]) : 0;
     165             : }
     166             : 
     167             : extern snap_main_t snap_main;
     168             : 
     169             : /* Register given node index to take input for given snap type. */
     170             : void
     171             : snap_register_input_protocol (vlib_main_t * vm,
     172             :                               char *name,
     173             :                               u32 ieee_oui, u16 protocol, u32 node_index);
     174             : 
     175             : format_function_t format_snap_protocol;
     176             : format_function_t format_snap_header;
     177             : format_function_t format_snap_header_with_length;
     178             : 
     179             : /* Parse snap protocol as 0xXXXX or protocol name. */
     180             : unformat_function_t unformat_snap_protocol;
     181             : 
     182             : /* Parse snap header. */
     183             : unformat_function_t unformat_snap_header;
     184             : unformat_function_t unformat_pg_snap_header;
     185             : 
     186             : #endif /* included_snap_h */
     187             : 
     188             : /*
     189             :  * fd.io coding-style-patch-verification: ON
     190             :  *
     191             :  * Local Variables:
     192             :  * eval: (c-set-style "gnu")
     193             :  * End:
     194             :  */

Generated by: LCOV version 1.14