http: fix client receiving large data
[vpp.git] / src / vnet / ip / ip_interface.h
1 /*
2  * Copyright (c) 2020 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 /**
17  * @file
18  * @brief IP prefix management on interfaces
19  */
20
21 #ifndef included_ip_interface_h
22 #define included_ip_interface_h
23
24 #include <vnet/ip/lookup.h>
25
26 clib_error_t *ip_interface_address_add (ip_lookup_main_t * lm,
27                                         u32 sw_if_index,
28                                         void *address,
29                                         u32 address_length,
30                                         u32 * result_index);
31 clib_error_t *ip_interface_address_del (ip_lookup_main_t * lm,
32                                         vnet_main_t * vnm,
33                                         u32 addr_index, void *address,
34                                         u32 address_length, u32 sw_if_index);
35 void *ip_interface_get_first_ip (u32 sw_if_index, u8 is_ip4);
36 void ip_interface_address_mark (void);
37 void ip_interface_address_sweep (void);
38 u32 ip_interface_address_find (ip_lookup_main_t * lm,
39                                void *addr_fib, u32 address_length);
40 u8 ip_interface_has_address (u32 sw_if_index, ip46_address_t * ip, u8 is_ip4);
41 walk_rc_t ip_interface_address_mark_one_interface (vnet_main_t *vnm,
42                                                    vnet_sw_interface_t *si,
43                                                    void *ctx);
44
45 always_inline void *
46 ip_interface_address_get_address (ip_lookup_main_t * lm,
47                                   ip_interface_address_t * a)
48 {
49   return mhash_key_to_mem (&lm->address_to_if_address_index, a->address_key);
50 }
51
52 always_inline ip_interface_prefix_t *
53 ip_get_interface_prefix (ip_lookup_main_t * lm, ip_interface_prefix_key_t * k)
54 {
55   uword *p = mhash_get (&lm->prefix_to_if_prefix_index, k);
56   return p ? pool_elt_at_index (lm->if_prefix_pool, p[0]) : 0;
57 }
58
59 #define foreach_ip_interface_address(lm,a,sw_if_index,loop,body)        \
60 do {                                                                    \
61     vnet_main_t *_vnm = vnet_get_main();                                \
62     u32 _sw_if_index = sw_if_index;                                     \
63     vnet_sw_interface_t *_swif;                                         \
64     _swif = vnet_get_sw_interface (_vnm, _sw_if_index);                 \
65                                                                         \
66     /*                                                                  \
67      * Loop => honor unnumbered interface addressing.                   \
68      */                                                                 \
69     if (_swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)               \
70       {                                                                 \
71         if (loop)                                                       \
72           _sw_if_index = _swif->unnumbered_sw_if_index;                 \
73         else                                                            \
74           /* the interface is unnumbered, by the caller does not want   \
75            * unnumbered interfaces considered/honoured */               \
76           break;                                                        \
77       }                                                                 \
78     u32 _ia = ((vec_len((lm)->if_address_pool_index_by_sw_if_index)     \
79                 > (_sw_if_index)) ?                                     \
80                vec_elt ((lm)->if_address_pool_index_by_sw_if_index,     \
81                         (_sw_if_index)) :                               \
82                (u32)~0);                                                \
83     ip_interface_address_t * _a;                                        \
84     while (_ia != ~0)                                                   \
85     {                                                                   \
86         _a = pool_elt_at_index ((lm)->if_address_pool, _ia);            \
87         _ia = _a->next_this_sw_interface;                               \
88         (a) = _a;                                                       \
89         body;                                                           \
90     }                                                                   \
91 } while (0)
92
93 #endif /* included_ip_interface_h */
94
95 /*
96  * fd.io coding-style-patch-verification: ON
97  *
98  * Local Variables:
99  * eval: (c-set-style "gnu")
100  * End:
101  */