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 : * ethernet_init.c: ethernet initialization
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 : #include <vlib/vlib.h>
41 : #include <vnet/ethernet/ethernet.h>
42 : #include <vnet/ip/ip.h> // for feature registration
43 :
44 : /* Global main structure. */
45 : ethernet_main_t ethernet_main;
46 :
47 : static void
48 39130 : add_type (ethernet_main_t * em, ethernet_type_t type, char *type_name)
49 : {
50 : ethernet_type_info_t *ti;
51 : u32 i;
52 :
53 39130 : vec_add2 (em->type_infos, ti, 1);
54 39130 : i = ti - em->type_infos;
55 :
56 39130 : ti->name = type_name;
57 39130 : ti->type = type;
58 39130 : ti->next_index = ti->node_index = ~0;
59 :
60 39130 : hash_set (em->type_info_by_type, type, i);
61 78260 : hash_set_mem (em->type_info_by_name, ti->name, i);
62 39130 : }
63 :
64 : /* Built-in ip4 tx feature path definition */
65 : /* *INDENT-OFF* */
66 1119 : VNET_FEATURE_ARC_INIT (ethernet_output, static) =
67 : {
68 : .arc_name = "ethernet-output",
69 : .last_in_arc = "error-drop",
70 : .start_nodes = VNET_FEATURES ("adj-l2-midchain"),
71 : .arc_index_ptr = ðernet_main.output_feature_arc_index,
72 : };
73 :
74 70583 : VNET_FEATURE_INIT (ethernet_tx_drop, static) =
75 : {
76 : .arc_name = "ethernet-output",
77 : .node_name = "error-drop",
78 : .runs_before = 0, /* not before any other features */
79 : };
80 : /* *INDENT-ON* */
81 :
82 : static clib_error_t *
83 559 : ethernet_init (vlib_main_t * vm)
84 : {
85 559 : ethernet_main_t *em = ðernet_main;
86 :
87 559 : em->vlib_main = vm;
88 :
89 559 : em->type_info_by_name = hash_create_string (0, sizeof (uword));
90 559 : em->type_info_by_type = hash_create (0, sizeof (uword));
91 : /*
92 : * System default ethernet interface MTU, configure via ethernet_config in
93 : * interface.c if desired.
94 : */
95 559 : em->default_mtu = 9000;
96 :
97 : #define ethernet_type(n,s) add_type (em, ETHERNET_TYPE_##s, #s);
98 : #include "types.def"
99 : #undef ethernet_type
100 :
101 : /*
102 : * ethernet_input_init is effectively part of this function.
103 : * Simply ensuring that it happens after we set up the hash tables
104 : * is not sufficient.
105 : */
106 559 : ethernet_input_init (vm, em);
107 559 : return 0;
108 : }
109 :
110 : /* *INDENT-OFF* */
111 11759 : VLIB_INIT_FUNCTION (ethernet_init) =
112 : {
113 : /*
114 : * Set up the L2 path before ethernet_init, or we'll wipe out the L2 ARP
115 : * registration set up by ethernet_arp_init.
116 : */
117 : .init_order = VLIB_INITS("l2_init",
118 : "ethernet_init",
119 : "llc_init",
120 : "vnet_feature_init"),
121 : };
122 : /* *INDENT-ON* */
123 :
124 : ethernet_main_t *
125 6255 : ethernet_get_main (vlib_main_t * vm)
126 : {
127 6255 : return ðernet_main;
128 : }
129 :
130 : /*
131 : * fd.io coding-style-patch-verification: ON
132 : *
133 : * Local Variables:
134 : * eval: (c-set-style "gnu")
135 : * End:
136 : */
|