LCOV - code coverage report
Current view: top level - vnet/ipsec - ah.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 21 31 67.7 %
Date: 2023-10-26 01:39:38 Functions: 5 5 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             : #ifndef __AH_H__
      16             : #define __AH_H__
      17             : 
      18             : #include <vnet/ip/ip.h>
      19             : #include <vnet/ipsec/ipsec.h>
      20             : #include <vnet/ipsec/ipsec.api_enum.h>
      21             : 
      22             : typedef struct
      23             : {
      24             :   unsigned char nexthdr;
      25             :   unsigned char hdrlen;
      26             :   unsigned short reserved;
      27             :   unsigned int spi;
      28             :   unsigned int seq_no;
      29             :   unsigned char auth_data[0];
      30             : } ah_header_t;
      31             : 
      32             : 
      33             : /* *INDENT-OFF* */
      34             : typedef CLIB_PACKED (struct {
      35             :   ip4_header_t ip4;
      36             :   ah_header_t ah;
      37             : }) ip4_and_ah_header_t;
      38             : /* *INDENT-ON* */
      39             : 
      40             : /* *INDENT-OFF* */
      41             : typedef CLIB_PACKED (struct {
      42             :   ip6_header_t ip6;
      43             :   ah_header_t ah;
      44             : }) ip6_and_ah_header_t;
      45             : /* *INDENT-ON* */
      46             : 
      47             : always_inline u32
      48          21 : ah_encrypt_err_to_sa_err (u32 err)
      49             : {
      50          21 :   switch (err)
      51             :     {
      52           0 :     case AH_ENCRYPT_ERROR_CRYPTO_ENGINE_ERROR:
      53           0 :       return IPSEC_SA_ERROR_CRYPTO_ENGINE_ERROR;
      54          21 :     case AH_ENCRYPT_ERROR_SEQ_CYCLED:
      55          21 :       return IPSEC_SA_ERROR_SEQ_CYCLED;
      56             :     }
      57           0 :   return ~0;
      58             : }
      59             : 
      60             : always_inline u32
      61          77 : ah_decrypt_err_to_sa_err (u32 err)
      62             : {
      63          77 :   switch (err)
      64             :     {
      65           0 :     case AH_DECRYPT_ERROR_DECRYPTION_FAILED:
      66           0 :       return IPSEC_SA_ERROR_DECRYPTION_FAILED;
      67          17 :     case AH_DECRYPT_ERROR_INTEG_ERROR:
      68          17 :       return IPSEC_SA_ERROR_INTEG_ERROR;
      69           0 :     case AH_DECRYPT_ERROR_NO_TAIL_SPACE:
      70           0 :       return IPSEC_SA_ERROR_NO_TAIL_SPACE;
      71           0 :     case AH_DECRYPT_ERROR_DROP_FRAGMENTS:
      72           0 :       return IPSEC_SA_ERROR_DROP_FRAGMENTS;
      73          60 :     case AH_DECRYPT_ERROR_REPLAY:
      74          60 :       return IPSEC_SA_ERROR_REPLAY;
      75             :     }
      76           0 :   return ~0;
      77             : }
      78             : 
      79             : always_inline void
      80          21 : ah_encrypt_set_next_index (vlib_buffer_t *b, vlib_node_runtime_t *node,
      81             :                            u32 thread_index, u32 err, u16 index, u16 *nexts,
      82             :                            u16 drop_next, u32 sa_index)
      83             : {
      84          21 :   ipsec_set_next_index (b, node, thread_index, err,
      85             :                         ah_encrypt_err_to_sa_err (err), index, nexts,
      86             :                         drop_next, sa_index);
      87          21 : }
      88             : 
      89             : always_inline void
      90          77 : ah_decrypt_set_next_index (vlib_buffer_t *b, vlib_node_runtime_t *node,
      91             :                            u32 thread_index, u32 err, u16 index, u16 *nexts,
      92             :                            u16 drop_next, u32 sa_index)
      93             : {
      94          77 :   ipsec_set_next_index (b, node, thread_index, err,
      95             :                         ah_decrypt_err_to_sa_err (err), index, nexts,
      96             :                         drop_next, sa_index);
      97          77 : }
      98             : 
      99             : always_inline u8
     100        7689 : ah_calc_icv_padding_len (u8 icv_size, int is_ipv6)
     101             : {
     102        7689 :   ASSERT (0 == is_ipv6 || 1 == is_ipv6);
     103        7689 :   const u8 req_multiple = 4 + 4 * is_ipv6;      // 4 for ipv4, 8 for ipv6
     104        7689 :   const u8 total_size = sizeof (ah_header_t) + icv_size;
     105        7689 :   return (req_multiple - total_size % req_multiple) % req_multiple;
     106             : }
     107             : 
     108             : #endif /* __AH_H__ */
     109             : 
     110             : /*
     111             :  * fd.io coding-style-patch-verification: ON
     112             :  *
     113             :  * Local Variables:
     114             :  * eval: (c-set-style "gnu")
     115             :  * End:
     116             :  */

Generated by: LCOV version 1.14