xref: /openbmc/ipmbbridge/ipmbutils.cpp (revision fe0d38a04eef4bf21b0c27ddc2b2e72528b123e3)
1*a642a948SDawid Frycki /* Copyright 2018 Intel
2*a642a948SDawid Frycki  *
3*a642a948SDawid Frycki  * Licensed under the Apache License, Version 2.0 (the "License");
4*a642a948SDawid Frycki  * you may not use this file except in compliance with the License.
5*a642a948SDawid Frycki  * You may obtain a copy of the License at
6*a642a948SDawid Frycki  *
7*a642a948SDawid Frycki  *    http://www.apache.org/licenses/LICENSE-2.0
8*a642a948SDawid Frycki  *
9*a642a948SDawid Frycki  *  Unless required by applicable law or agreed to in writing, software
10*a642a948SDawid Frycki  *  distributed under the License is distributed on an "AS IS" BASIS,
11*a642a948SDawid Frycki  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*a642a948SDawid Frycki  *  See the License for the specific language governing permissions and
13*a642a948SDawid Frycki  *  limitations under the License.
14*a642a948SDawid Frycki  */
15*a642a948SDawid Frycki 
16*a642a948SDawid Frycki #include "ipmbbridged.hpp"
17*a642a948SDawid Frycki #include "ipmbdefines.hpp"
18*a642a948SDawid Frycki 
19*a642a948SDawid Frycki #include <inttypes.h>
20*a642a948SDawid Frycki #include <sys/stat.h>
21*a642a948SDawid Frycki #include <sys/types.h>
22*a642a948SDawid Frycki #include <unistd.h>
23*a642a948SDawid Frycki 
24*a642a948SDawid Frycki /**
25*a642a948SDawid Frycki  * @brief Ipmb utils for checksum
26*a642a948SDawid Frycki  */
ipmbChecksumValidate(uint8_t * data,uint8_t length)27*a642a948SDawid Frycki bool ipmbChecksumValidate(uint8_t* data, uint8_t length)
28*a642a948SDawid Frycki {
29*a642a948SDawid Frycki     uint8_t checksum = 0;
30*a642a948SDawid Frycki 
31*a642a948SDawid Frycki     // compute checksum.
32*a642a948SDawid Frycki     for (uint8_t idx = 0; idx < length; idx++)
33*a642a948SDawid Frycki     {
34*a642a948SDawid Frycki         checksum += data[idx];
35*a642a948SDawid Frycki     }
36*a642a948SDawid Frycki 
37*a642a948SDawid Frycki     // check if checksum is valid.
38*a642a948SDawid Frycki     if (0 == checksum)
39*a642a948SDawid Frycki     {
40*a642a948SDawid Frycki         // checksum valid.
41*a642a948SDawid Frycki         return true;
42*a642a948SDawid Frycki     }
43*a642a948SDawid Frycki     else
44*a642a948SDawid Frycki     {
45*a642a948SDawid Frycki         // checksum invalid.
46*a642a948SDawid Frycki         return false;
47*a642a948SDawid Frycki     }
48*a642a948SDawid Frycki }
49*a642a948SDawid Frycki 
ipmbChecksumCompute(uint8_t * data,uint8_t length)50*a642a948SDawid Frycki uint8_t ipmbChecksumCompute(uint8_t* data, uint8_t length)
51*a642a948SDawid Frycki {
52*a642a948SDawid Frycki     uint8_t checksum = 0;
53*a642a948SDawid Frycki 
54*a642a948SDawid Frycki     // compute checksum.
55*a642a948SDawid Frycki     for (uint8_t idx = 0; idx < length; idx++)
56*a642a948SDawid Frycki     {
57*a642a948SDawid Frycki         checksum += data[idx];
58*a642a948SDawid Frycki     }
59*a642a948SDawid Frycki 
60*a642a948SDawid Frycki     checksum = (~checksum) + 1;
61*a642a948SDawid Frycki 
62*a642a948SDawid Frycki     // return computed checksum value.
63*a642a948SDawid Frycki     return checksum;
64*a642a948SDawid Frycki }
65*a642a948SDawid Frycki 
ipmbConnectionHeaderChecksumValidate(IPMB_HEADER * ipmbHeader)66*a642a948SDawid Frycki inline bool ipmbConnectionHeaderChecksumValidate(IPMB_HEADER* ipmbHeader)
67*a642a948SDawid Frycki {
68*a642a948SDawid Frycki     return ipmbChecksumValidate(reinterpret_cast<uint8_t*>(ipmbHeader),
69*a642a948SDawid Frycki                                 ipmbConnectionHeaderLength);
70*a642a948SDawid Frycki }
71*a642a948SDawid Frycki 
ipmbDataChecksumValidate(IPMB_HEADER * ipmbHeader,uint8_t length)72*a642a948SDawid Frycki inline bool ipmbDataChecksumValidate(IPMB_HEADER* ipmbHeader, uint8_t length)
73*a642a948SDawid Frycki {
74*a642a948SDawid Frycki     return ipmbChecksumValidate(
75*a642a948SDawid Frycki         (reinterpret_cast<uint8_t*>(ipmbHeader) + ipmbConnectionHeaderLength),
76*a642a948SDawid Frycki         (length - ipmbConnectionHeaderLength));
77*a642a948SDawid Frycki }
78*a642a948SDawid Frycki 
isFrameValid(IPMB_HEADER * frame,uint8_t length)79*a642a948SDawid Frycki bool isFrameValid(IPMB_HEADER* frame, uint8_t length)
80*a642a948SDawid Frycki {
81*a642a948SDawid Frycki     bool frameValid = ipmbConnectionHeaderChecksumValidate(frame);
82*a642a948SDawid Frycki     if (false == frameValid)
83*a642a948SDawid Frycki     {
84*a642a948SDawid Frycki         // invalid connection header checksum.
85*a642a948SDawid Frycki         return false;
86*a642a948SDawid Frycki     }
87*a642a948SDawid Frycki 
88*a642a948SDawid Frycki     // data checksum validation.
89*a642a948SDawid Frycki     return ipmbDataChecksumValidate(frame, length);
90*a642a948SDawid Frycki }
91