LCOV - code coverage report
Current view: top level - vnet - interface_output.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 33 46 71.7 %
Date: 2023-10-26 01:39:38 Functions: 4 4 100.0 %

          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             :  * interface_output.c: interface output node
      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 __INTERFACE_INLINES_H__
      41             : #define __INTERFACE_INLINES_H__
      42             : 
      43             : #include <vnet/vnet.h>
      44             : #include <vnet/tcp/tcp_packet.h>
      45             : 
      46             : static_always_inline void
      47      405484 : vnet_calc_ip4_checksums (vlib_main_t *vm, vlib_buffer_t *b, ip4_header_t *ip4,
      48             :                          tcp_header_t *th, udp_header_t *uh,
      49             :                          vnet_buffer_oflags_t oflags)
      50             : {
      51      405484 :   if (oflags & VNET_BUFFER_OFFLOAD_F_IP_CKSUM)
      52         135 :     ip4->checksum = ip4_header_checksum (ip4);
      53      405484 :   if (oflags & VNET_BUFFER_OFFLOAD_F_TCP_CKSUM)
      54             :     {
      55      405354 :       th->checksum = 0;
      56      405354 :       th->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
      57             :     }
      58      405484 :   if (oflags & VNET_BUFFER_OFFLOAD_F_UDP_CKSUM)
      59             :     {
      60         130 :       uh->checksum = 0;
      61         130 :       uh->checksum = ip4_tcp_udp_compute_checksum (vm, b, ip4);
      62             :     }
      63      405484 : }
      64             : 
      65             : static_always_inline void
      66      322511 : vnet_calc_ip6_checksums (vlib_main_t *vm, vlib_buffer_t *b, ip6_header_t *ip6,
      67             :                          tcp_header_t *th, udp_header_t *uh,
      68             :                          vnet_buffer_oflags_t oflags)
      69             : {
      70             :   int bogus;
      71      322511 :   if (oflags & VNET_BUFFER_OFFLOAD_F_TCP_CKSUM)
      72             :     {
      73      322511 :       th->checksum = 0;
      74      322511 :       th->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6, &bogus);
      75             :     }
      76      322511 :   if (oflags & VNET_BUFFER_OFFLOAD_F_UDP_CKSUM)
      77             :     {
      78           0 :       uh->checksum = 0;
      79           0 :       uh->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6, &bogus);
      80             :     }
      81      322511 : }
      82             : 
      83             : static_always_inline void
      84     9388450 : vnet_calc_checksums_inline (vlib_main_t * vm, vlib_buffer_t * b,
      85             :                             int is_ip4, int is_ip6)
      86             : {
      87             :   ip4_header_t *ip4;
      88             :   ip6_header_t *ip6;
      89             :   tcp_header_t *th;
      90             :   udp_header_t *uh;
      91             :   vnet_buffer_oflags_t oflags;
      92             : 
      93     9388450 :   if (!(b->flags & VNET_BUFFER_F_OFFLOAD))
      94     8660455 :     return;
      95             : 
      96      727995 :   ASSERT (!(is_ip4 && is_ip6));
      97             : 
      98      727995 :   ip4 = (ip4_header_t *) (b->data + vnet_buffer (b)->l3_hdr_offset);
      99      727995 :   ip6 = (ip6_header_t *) (b->data + vnet_buffer (b)->l3_hdr_offset);
     100      727995 :   th = (tcp_header_t *) (b->data + vnet_buffer (b)->l4_hdr_offset);
     101      727995 :   uh = (udp_header_t *) (b->data + vnet_buffer (b)->l4_hdr_offset);
     102      727995 :   oflags = vnet_buffer (b)->oflags;
     103             : 
     104      727995 :   if (is_ip4)
     105             :     {
     106      405484 :       vnet_calc_ip4_checksums (vm, b, ip4, th, uh, oflags);
     107             :     }
     108      322511 :   else if (is_ip6)
     109             :     {
     110      322511 :       vnet_calc_ip6_checksums (vm, b, ip6, th, uh, oflags);
     111             :     }
     112             : 
     113      727995 :   vnet_buffer_offload_flags_clear (b, (VNET_BUFFER_OFFLOAD_F_IP_CKSUM |
     114             :                                        VNET_BUFFER_OFFLOAD_F_UDP_CKSUM |
     115             :                                        VNET_BUFFER_OFFLOAD_F_TCP_CKSUM));
     116             : }
     117             : 
     118             : static_always_inline void
     119     9341550 : vnet_calc_outer_checksums_inline (vlib_main_t *vm, vlib_buffer_t *b)
     120             : {
     121             : 
     122     9341550 :   if (!(b->flags & VNET_BUFFER_F_OFFLOAD))
     123     9341550 :     return;
     124             : 
     125           0 :   vnet_buffer_oflags_t oflags = vnet_buffer (b)->oflags;
     126           0 :   if (oflags & VNET_BUFFER_OFFLOAD_F_OUTER_IP_CKSUM)
     127             :     {
     128             :       ip4_header_t *ip4;
     129           0 :       ip4 = (ip4_header_t *) (b->data + vnet_buffer2 (b)->outer_l3_hdr_offset);
     130           0 :       ip4->checksum = ip4_header_checksum (ip4);
     131           0 :       vnet_buffer_offload_flags_clear (b,
     132             :                                        VNET_BUFFER_OFFLOAD_F_OUTER_IP_CKSUM);
     133             :     }
     134           0 :   else if (oflags & VNET_BUFFER_OFFLOAD_F_OUTER_UDP_CKSUM)
     135             :     {
     136             :       int bogus;
     137             :       ip6_header_t *ip6;
     138             :       udp_header_t *uh;
     139             : 
     140           0 :       ip6 = (ip6_header_t *) (b->data + vnet_buffer2 (b)->outer_l3_hdr_offset);
     141           0 :       uh = (udp_header_t *) (b->data + vnet_buffer2 (b)->outer_l4_hdr_offset);
     142           0 :       uh->checksum = 0;
     143           0 :       uh->checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6, &bogus);
     144           0 :       vnet_buffer_offload_flags_clear (b,
     145             :                                        VNET_BUFFER_OFFLOAD_F_OUTER_UDP_CKSUM);
     146             :     }
     147             : }
     148             : #endif
     149             : 
     150             : /*
     151             :  * fd.io coding-style-patch-verification: ON
     152             :  *
     153             :  * Local Variables:
     154             :  * eval: (c-set-style "gnu")
     155             :  * End:
     156             :  */

Generated by: LCOV version 1.14