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