xref: /openbmc/google-misc/dhcp-done/subprojects/ncsid/src/net_iface.h (revision 1285115c16180bd28a3cfe79d9db8d10c84fe2ed)
1*1285115cSWilliam A. Kennington III /*
2*1285115cSWilliam A. Kennington III  * Copyright 2021 Google LLC
3*1285115cSWilliam A. Kennington III  *
4*1285115cSWilliam A. Kennington III  * Licensed under the Apache License, Version 2.0 (the "License");
5*1285115cSWilliam A. Kennington III  * you may not use this file except in compliance with the License.
6*1285115cSWilliam A. Kennington III  * You may obtain a copy of the License at
7*1285115cSWilliam A. Kennington III  *
8*1285115cSWilliam A. Kennington III  *      http://www.apache.org/licenses/LICENSE-2.0
9*1285115cSWilliam A. Kennington III  *
10*1285115cSWilliam A. Kennington III  * Unless required by applicable law or agreed to in writing, software
11*1285115cSWilliam A. Kennington III  * distributed under the License is distributed on an "AS IS" BASIS,
12*1285115cSWilliam A. Kennington III  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1285115cSWilliam A. Kennington III  * See the License for the specific language governing permissions and
14*1285115cSWilliam A. Kennington III  * limitations under the License.
15*1285115cSWilliam A. Kennington III  */
16*1285115cSWilliam A. Kennington III 
17*1285115cSWilliam A. Kennington III #pragma once
18*1285115cSWilliam A. Kennington III 
19*1285115cSWilliam A. Kennington III #include <linux/if.h>
20*1285115cSWilliam A. Kennington III #include <linux/if_packet.h>
21*1285115cSWilliam A. Kennington III #include <net/ethernet.h>
22*1285115cSWilliam A. Kennington III #include <netinet/in.h>
23*1285115cSWilliam A. Kennington III #include <sys/ioctl.h>
24*1285115cSWilliam A. Kennington III #include <sys/socket.h>
25*1285115cSWilliam A. Kennington III 
26*1285115cSWilliam A. Kennington III #include <functional>
27*1285115cSWilliam A. Kennington III #include <string>
28*1285115cSWilliam A. Kennington III 
29*1285115cSWilliam A. Kennington III namespace net
30*1285115cSWilliam A. Kennington III {
31*1285115cSWilliam A. Kennington III 
32*1285115cSWilliam A. Kennington III class IFaceBase
33*1285115cSWilliam A. Kennington III {
34*1285115cSWilliam A. Kennington III   public:
35*1285115cSWilliam A. Kennington III     explicit IFaceBase(const std::string& name);
36*1285115cSWilliam A. Kennington III     virtual ~IFaceBase() = default;
37*1285115cSWilliam A. Kennington III 
38*1285115cSWilliam A. Kennington III     /** @brief Get the index of the network interface corresponding
39*1285115cSWilliam A. Kennington III      * to this object.
40*1285115cSWilliam A. Kennington III      */
41*1285115cSWilliam A. Kennington III     int get_index() const;
42*1285115cSWilliam A. Kennington III 
43*1285115cSWilliam A. Kennington III     /** @brief Set interface flags using provided socket.
44*1285115cSWilliam A. Kennington III      *
45*1285115cSWilliam A. Kennington III      *  @param[in] sockfd - Socket to use for SIOCSIFFLAGS ioctl call.
46*1285115cSWilliam A. Kennington III      *  @param[in] flags - Flags to set.
47*1285115cSWilliam A. Kennington III      */
48*1285115cSWilliam A. Kennington III     int set_sock_flags(int sockfd, short flags) const;
49*1285115cSWilliam A. Kennington III 
50*1285115cSWilliam A. Kennington III     /** @brief Clear interface flags using provided socket.
51*1285115cSWilliam A. Kennington III      *
52*1285115cSWilliam A. Kennington III      *  @param[in] sockfd - Socket to use for SIOCSIFFLAGS/SIOCGIFFLAGS
53*1285115cSWilliam A. Kennington III      *      ioctl call.
54*1285115cSWilliam A. Kennington III      *  @param[in] flags - Flags to clear.
55*1285115cSWilliam A. Kennington III      */
56*1285115cSWilliam A. Kennington III     int clear_sock_flags(int sockfd, short flags) const;
57*1285115cSWilliam A. Kennington III 
58*1285115cSWilliam A. Kennington III     /** @brief Bind given socket to this interface. Similar to bind
59*1285115cSWilliam A. Kennington III      *     syscall, except that it fills in sll_ifindex field
60*1285115cSWilliam A. Kennington III      *     of struct sockaddr_ll with the index of this interface.
61*1285115cSWilliam A. Kennington III      */
62*1285115cSWilliam A. Kennington III     virtual int bind_sock(int sockfd, struct sockaddr_ll* saddr) const = 0;
63*1285115cSWilliam A. Kennington III 
64*1285115cSWilliam A. Kennington III   protected:
65*1285115cSWilliam A. Kennington III     std::string name_;
66*1285115cSWilliam A. Kennington III 
67*1285115cSWilliam A. Kennington III   private:
68*1285115cSWilliam A. Kennington III     /** @brief Similar to ioctl syscall, but the socket is created inside
69*1285115cSWilliam A. Kennington III      *      the function and the interface name in struct ifreq is
70*1285115cSWilliam A. Kennington III      *      properly populated with the index of this interface.
71*1285115cSWilliam A. Kennington III      */
72*1285115cSWilliam A. Kennington III     virtual int ioctl(int request, struct ifreq* ifr) const = 0;
73*1285115cSWilliam A. Kennington III 
74*1285115cSWilliam A. Kennington III     /** @brief Similar to ioctl syscall. The interface index in
75*1285115cSWilliam A. Kennington III      *      struct ifreq is
76*1285115cSWilliam A. Kennington III      *      properly populated with the index of this interface.
77*1285115cSWilliam A. Kennington III      */
78*1285115cSWilliam A. Kennington III     virtual int ioctl_sock(int sockfd, int request,
79*1285115cSWilliam A. Kennington III                            struct ifreq* ifr) const = 0;
80*1285115cSWilliam A. Kennington III 
81*1285115cSWilliam A. Kennington III     /** @brief Modify interface flags, using the given socket for
82*1285115cSWilliam A. Kennington III      *      ioctl call.
83*1285115cSWilliam A. Kennington III      */
84*1285115cSWilliam A. Kennington III     int mod_sock_flags(int sockfd, short flags, bool set) const;
85*1285115cSWilliam A. Kennington III };
86*1285115cSWilliam A. Kennington III 
87*1285115cSWilliam A. Kennington III class IFace : public IFaceBase
88*1285115cSWilliam A. Kennington III {
89*1285115cSWilliam A. Kennington III   public:
90*1285115cSWilliam A. Kennington III     explicit IFace(const std::string& name) : IFaceBase(name)
91*1285115cSWilliam A. Kennington III     {}
92*1285115cSWilliam A. Kennington III 
93*1285115cSWilliam A. Kennington III     /** @brief Bind given socket to this interface. Similar to bind
94*1285115cSWilliam A. Kennington III      *     syscall, except that it fills in sll_ifindex field
95*1285115cSWilliam A. Kennington III      *     of struct sockaddr_ll with the index of this interface.
96*1285115cSWilliam A. Kennington III      */
97*1285115cSWilliam A. Kennington III     int bind_sock(int sockfd, struct sockaddr_ll* saddr) const override;
98*1285115cSWilliam A. Kennington III 
99*1285115cSWilliam A. Kennington III   private:
100*1285115cSWilliam A. Kennington III     /** @brief Similar to ioctl syscall, but the socket is created inside
101*1285115cSWilliam A. Kennington III      *      the function and the interface name in struct ifreq is
102*1285115cSWilliam A. Kennington III      *      properly populated with the index of this interface.
103*1285115cSWilliam A. Kennington III      */
104*1285115cSWilliam A. Kennington III     int ioctl(int request, struct ifreq* ifr) const override;
105*1285115cSWilliam A. Kennington III     /** @brief Similar to ioctl syscall. The interface index in
106*1285115cSWilliam A. Kennington III      *      struct ifreq is
107*1285115cSWilliam A. Kennington III      *      properly populated with the index of this interface.
108*1285115cSWilliam A. Kennington III      */
109*1285115cSWilliam A. Kennington III     int ioctl_sock(int sockfd, int request, struct ifreq* ifr) const override;
110*1285115cSWilliam A. Kennington III };
111*1285115cSWilliam A. Kennington III 
112*1285115cSWilliam A. Kennington III } // namespace net
113