1 /*
2  * Copyright 2008-2015 Freescale Semiconductor Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 /******************************************************************************
33 
34  @File          fm_macsec.c
35 
36  @Description   FM MACSEC driver routines implementation.
37 *//***************************************************************************/
38 
39 #include "std_ext.h"
40 #include "error_ext.h"
41 #include "xx_ext.h"
42 #include "string_ext.h"
43 #include "sprint_ext.h"
44 #include "debug_ext.h"
45 
46 #include "fm_macsec.h"
47 
48 
49 /****************************************/
50 /*       API Init unit functions        */
51 /****************************************/
52 t_Handle FM_MACSEC_Config(t_FmMacsecParams *p_FmMacsecParam)
53 {
54     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver;
55 
56     SANITY_CHECK_RETURN_VALUE(p_FmMacsecParam, E_INVALID_HANDLE, NULL);
57 
58     if (p_FmMacsecParam->guestMode)
59         p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)FM_MACSEC_GUEST_Config(p_FmMacsecParam);
60     else
61         p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)FM_MACSEC_MASTER_Config(p_FmMacsecParam);
62 
63     if (!p_FmMacsecControllerDriver)
64         return NULL;
65 
66     return (t_Handle)p_FmMacsecControllerDriver;
67 }
68 
69 t_Error FM_MACSEC_Init(t_Handle h_FmMacsec)
70 {
71     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
72 
73     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
74 
75     if (p_FmMacsecControllerDriver->f_FM_MACSEC_Init)
76         return p_FmMacsecControllerDriver->f_FM_MACSEC_Init(h_FmMacsec);
77 
78     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
79 }
80 
81 t_Error FM_MACSEC_Free(t_Handle h_FmMacsec)
82 {
83     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
84 
85     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
86 
87     if (p_FmMacsecControllerDriver->f_FM_MACSEC_Free)
88         return p_FmMacsecControllerDriver->f_FM_MACSEC_Free(h_FmMacsec);
89 
90     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
91 }
92 
93 t_Error FM_MACSEC_ConfigUnknownSciFrameTreatment(t_Handle h_FmMacsec, e_FmMacsecUnknownSciFrameTreatment treatMode)
94 {
95     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
96 
97     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
98 
99     if (p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigUnknownSciFrameTreatment)
100         return p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigUnknownSciFrameTreatment(h_FmMacsec, treatMode);
101 
102     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
103 }
104 
105 t_Error FM_MACSEC_ConfigInvalidTagsFrameTreatment(t_Handle h_FmMacsec, bool deliverUncontrolled)
106 {
107     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
108 
109     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
110 
111     if (p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigInvalidTagsFrameTreatment)
112         return p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigInvalidTagsFrameTreatment(h_FmMacsec, deliverUncontrolled);
113 
114     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
115 }
116 
117 t_Error FM_MACSEC_ConfigEncryptWithNoChangedTextFrameTreatment(t_Handle h_FmMacsec, bool discardUncontrolled)
118 {
119     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
120 
121     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
122 
123     if (p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigEncryptWithNoChangedTextFrameTreatment)
124         return p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigEncryptWithNoChangedTextFrameTreatment(h_FmMacsec, discardUncontrolled);
125 
126     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
127 }
128 
129 t_Error FM_MACSEC_ConfigUntagFrameTreatment(t_Handle h_FmMacsec, e_FmMacsecUntagFrameTreatment treatMode)
130 {
131     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
132 
133     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
134 
135     if (p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigUntagFrameTreatment)
136         return p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigUntagFrameTreatment(h_FmMacsec, treatMode);
137 
138     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
139 }
140 
141 t_Error FM_MACSEC_ConfigPnExhaustionThreshold(t_Handle h_FmMacsec, uint32_t pnExhThr)
142 {
143     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
144 
145     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
146 
147     if (p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigPnExhaustionThreshold)
148         return p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigPnExhaustionThreshold(h_FmMacsec, pnExhThr);
149 
150     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
151 }
152 
153 t_Error FM_MACSEC_ConfigKeysUnreadable(t_Handle h_FmMacsec)
154 {
155     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
156 
157     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
158 
159     if (p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigKeysUnreadable)
160         return p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigKeysUnreadable(h_FmMacsec);
161 
162     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
163 }
164 
165 t_Error FM_MACSEC_ConfigSectagWithoutSCI(t_Handle h_FmMacsec)
166 {
167     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
168 
169     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
170 
171     if (p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigSectagWithoutSCI)
172         return p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigSectagWithoutSCI(h_FmMacsec);
173 
174     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
175 }
176 
177 t_Error FM_MACSEC_ConfigException(t_Handle h_FmMacsec, e_FmMacsecExceptions exception, bool enable)
178 {
179     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
180 
181     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
182 
183     if (p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigException)
184         return p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigException(h_FmMacsec, exception, enable);
185 
186     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
187 }
188 
189 t_Error FM_MACSEC_GetRevision(t_Handle h_FmMacsec, uint32_t *p_MacsecRevision)
190 {
191     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
192 
193     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
194 
195     if (p_FmMacsecControllerDriver->f_FM_MACSEC_GetRevision)
196         return p_FmMacsecControllerDriver->f_FM_MACSEC_GetRevision(h_FmMacsec, p_MacsecRevision);
197 
198     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
199 }
200 
201 
202 t_Error FM_MACSEC_Enable(t_Handle h_FmMacsec)
203 {
204     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
205 
206     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
207 
208     if (p_FmMacsecControllerDriver->f_FM_MACSEC_Enable)
209         return p_FmMacsecControllerDriver->f_FM_MACSEC_Enable(h_FmMacsec);
210 
211     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
212 }
213 
214 t_Error FM_MACSEC_Disable(t_Handle h_FmMacsec)
215 {
216     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
217 
218     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
219 
220     if (p_FmMacsecControllerDriver->f_FM_MACSEC_Disable)
221         return p_FmMacsecControllerDriver->f_FM_MACSEC_Disable(h_FmMacsec);
222 
223     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
224 }
225 
226 t_Error FM_MACSEC_SetException(t_Handle h_FmMacsec, e_FmMacsecExceptions exception, bool enable)
227 {
228     t_FmMacsecControllerDriver *p_FmMacsecControllerDriver = (t_FmMacsecControllerDriver *)h_FmMacsec;
229 
230     SANITY_CHECK_RETURN_ERROR(p_FmMacsecControllerDriver, E_INVALID_HANDLE);
231 
232     if (p_FmMacsecControllerDriver->f_FM_MACSEC_SetException)
233         return p_FmMacsecControllerDriver->f_FM_MACSEC_SetException(h_FmMacsec, exception, enable);
234 
235     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
236 }
237 
238