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