1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <libnl++/Buffer.h>
20 
21 #include <linux/can.h>
22 #include <net/if.h>
23 
24 #include <string>
25 
26 namespace android::nl {
27 
28 /**
29  * Returns the index of a given network interface.
30  *
31  * If the syscall to check the index fails with other error than ENODEV, it gets logged and the
32  * return value indicates the interface doesn't exists.
33  *
34  * \param ifname Interface to check
35  * \return Interface index, or 0 if the interface doesn't exist
36  */
37 unsigned int nametoindex(const std::string& ifname);
38 
39 /**
40  * Filter a string against non-printable characters.
41  *
42  * Replaces all non-printable characters with '?'.
43  *
44  * \param str String to filter.
45  * \return Filtered string.
46  */
47 std::string printableOnly(std::string str);
48 
49 /**
50  * Calculates a (optionally running) CRC16 checksum.
51  *
52  * CRC16 isn't a strong checksum, but is good for quick comparison purposes.
53  * One benefit (and also a drawback too) is that all-zero payloads with any length will
54  * always have a checksum of 0x0000.
55  *
56  * \param data Buffer to calculate checksum for
57  * \param crc Previous CRC16 value to continue calculating running checksum
58  * \return CRC16 checksum
59  */
60 uint16_t crc16(const Buffer<uint8_t> data, uint16_t crc = 0);
61 
62 }  // namespace android::nl
63