initial release
[apps/tidep0074.git] / ipu1 / PktSwitch.c
1 /*
2  * Copyright (c) 2016, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
33 #include <stdio.h>
34 #include <stdint.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include "ti/csl/cslr_device.h"
39 #include <icss_emacDrv.h>
41 #define BYTESWAP16(x)   ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
42 #define ETH_ALEN        6
43 #define ETH_VLAN        0x8100
44 #define ETH_TYPE_GOOSE  0x88B8
45 #define ETH_TYPE_PTP    0x88F7
46 #define ETH_TYPE_SV     0x88BA
48 #define ACCEPT_APPID_NUM        4
49 #define DEST_MAC_NUM            4
51 char vlan;
52 extern uint32_t bGooseFilter;
53 extern char ptpMulDest1MacAddr[ETH_ALEN];
54 extern char ptpMulDest2MacAddr[ETH_ALEN];
55 extern char GooseDestMacAddr[DEST_MAC_NUM][ETH_ALEN];
56 extern uint16_t GooseAPPID[ACCEPT_APPID_NUM];
58 /**
59 * @internal
60 * @brief GOOSE filtering algorithm
61 *
62 * @param pIcssRxPkt: received packet data pointer
63 *
64 * @retval packet type 
65 */
67 int32_t GooseProc(char *pIcssRxPkt)
68 {
69         int32_t i, appId;
70         int32_t bMac;
72         if(vlan == 1)
73                 appId = *(uint16_t *)((char *)pIcssRxPkt + 2 * 
74                                 ETH_ALEN + 2 + 4); 
75         else 
76                 appId = *(uint16_t *)((char *)pIcssRxPkt + 2 * 
77                                 ETH_ALEN + 2); 
79         appId = BYTESWAP16(appId);
81         if (bGooseFilter == 1) {
82                 bMac = 0;
83                 for ( i = 0; i < DEST_MAC_NUM; i++ ) {
84                         if (memcmp(pIcssRxPkt, GooseDestMacAddr[i], 
85                                                 ETH_ALEN) == 0) {
86                                 bMac = 1;
87                                 break;
88                         }
89                 }
91                 if (bMac == 1) {
92                         /* Drop a GOOSE packet not having APPID from the list of
93                            acceptable APPIDs */
94                         for (i = 0; i < ACCEPT_APPID_NUM; i++) {
95                                 if((appId == GooseAPPID[i]) && (appId < 0x3FFF))
96                                         return PKT_PROC_GOOSE;
97                                 else if (appId == GooseAPPID[i]) 
98                                         return PKT_PROC_GOOSE;
99                         }
100                         return PKT_PROC_NONE;
101                 }
102                 else return PKT_PROC_MPU;
103         }
105         else
106                 if (appId < 0x3FFF)
107                         return PKT_PROC_GOOSE;
108                 else 
109                         return PKT_PROC_GOOSE;  
113 int32_t PtpProc(char *pIcssRxPkt)
115         if((memcmp(pIcssRxPkt, ptpMulDest1MacAddr, ETH_ALEN) == 0) ||
116                 (memcmp(pIcssRxPkt, ptpMulDest2MacAddr, ETH_ALEN) == 0))
117                 return PKT_PROC_PTP;
118          else
119                 return PKT_PROC_NONE;
123 int32_t SvProc(char *pIcssRxPkt)
125         //Log_print0(Diags_INFO, "Placeholder for SV packet filtering");
126         return PKT_PROC_NONE;   
129 int32_t Filter2(char *pIcssRxPkt)
131         //Log_print0(Diags_INFO, "Placeholder for additional filtering");
132         return PKT_PROC_NONE;   
135 /**
136 * @internal
137 * @brief packet switch logic
139 * @param pIcssRxPkt: received packet data pointer
141 * @retval packet type 
142 */
143 int32_t PruSwitch(char *pIcssRxPkt)
145         uint16_t ethType;
147         ethType = *(uint16_t *)(pIcssRxPkt  +  2 * ETH_ALEN);
148         ethType = BYTESWAP16(ethType);
150         if (ethType == ETH_VLAN) {
151                 vlan = 1;
152                 ethType = *(uint16_t *)((char *)pIcssRxPkt  +  2 * 
153                                 ETH_ALEN + 2 + 2);
154         }       
155         else {
156                 vlan = 0;
157                 ethType = *(uint16_t *)((char *)pIcssRxPkt  +  2 * ETH_ALEN);
158         }
159         ethType = BYTESWAP16(ethType);
161         switch (ethType) {
162                 case ETH_TYPE_GOOSE: 
163                         return GooseProc(pIcssRxPkt);
164                 case ETH_TYPE_PTP:
165                         return PtpProc(pIcssRxPkt);
166                 case ETH_TYPE_SV:
167                         return SvProc(pIcssRxPkt);
168                 default: 
169                         Filter2(pIcssRxPkt);
170                         return PKT_PROC_MPU;
171         }