11285115cSWilliam A. Kennington III /* 21285115cSWilliam A. Kennington III * Copyright 2021 Google LLC 31285115cSWilliam A. Kennington III * 41285115cSWilliam A. Kennington III * Licensed under the Apache License, Version 2.0 (the "License"); 51285115cSWilliam A. Kennington III * you may not use this file except in compliance with the License. 61285115cSWilliam A. Kennington III * You may obtain a copy of the License at 71285115cSWilliam A. Kennington III * 81285115cSWilliam A. Kennington III * http://www.apache.org/licenses/LICENSE-2.0 91285115cSWilliam A. Kennington III * 101285115cSWilliam A. Kennington III * Unless required by applicable law or agreed to in writing, software 111285115cSWilliam A. Kennington III * distributed under the License is distributed on an "AS IS" BASIS, 121285115cSWilliam A. Kennington III * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131285115cSWilliam A. Kennington III * See the License for the specific language governing permissions and 141285115cSWilliam A. Kennington III * limitations under the License. 151285115cSWilliam A. Kennington III */ 161285115cSWilliam A. Kennington III 171285115cSWilliam A. Kennington III #pragma once 181285115cSWilliam A. Kennington III 191285115cSWilliam A. Kennington III #include <linux/if.h> 201285115cSWilliam A. Kennington III #include <linux/if_packet.h> 211285115cSWilliam A. Kennington III #include <sys/socket.h> 221285115cSWilliam A. Kennington III 231285115cSWilliam A. Kennington III #include <string> 241285115cSWilliam A. Kennington III 251285115cSWilliam A. Kennington III namespace net 261285115cSWilliam A. Kennington III { 271285115cSWilliam A. Kennington III 281285115cSWilliam A. Kennington III class IFaceBase 291285115cSWilliam A. Kennington III { 301285115cSWilliam A. Kennington III public: 311285115cSWilliam A. Kennington III explicit IFaceBase(const std::string& name); 321285115cSWilliam A. Kennington III virtual ~IFaceBase() = default; 331285115cSWilliam A. Kennington III 341285115cSWilliam A. Kennington III /** @brief Get the index of the network interface corresponding 351285115cSWilliam A. Kennington III * to this object. 361285115cSWilliam A. Kennington III */ 371285115cSWilliam A. Kennington III int get_index() const; 381285115cSWilliam A. Kennington III 391285115cSWilliam A. Kennington III /** @brief Set interface flags using provided socket. 401285115cSWilliam A. Kennington III * 411285115cSWilliam A. Kennington III * @param[in] sockfd - Socket to use for SIOCSIFFLAGS ioctl call. 421285115cSWilliam A. Kennington III * @param[in] flags - Flags to set. 431285115cSWilliam A. Kennington III */ 441285115cSWilliam A. Kennington III int set_sock_flags(int sockfd, short flags) const; 451285115cSWilliam A. Kennington III 461285115cSWilliam A. Kennington III /** @brief Clear interface flags using provided socket. 471285115cSWilliam A. Kennington III * 481285115cSWilliam A. Kennington III * @param[in] sockfd - Socket to use for SIOCSIFFLAGS/SIOCGIFFLAGS 491285115cSWilliam A. Kennington III * ioctl call. 501285115cSWilliam A. Kennington III * @param[in] flags - Flags to clear. 511285115cSWilliam A. Kennington III */ 521285115cSWilliam A. Kennington III int clear_sock_flags(int sockfd, short flags) const; 531285115cSWilliam A. Kennington III 541285115cSWilliam A. Kennington III /** @brief Bind given socket to this interface. Similar to bind 551285115cSWilliam A. Kennington III * syscall, except that it fills in sll_ifindex field 561285115cSWilliam A. Kennington III * of struct sockaddr_ll with the index of this interface. 571285115cSWilliam A. Kennington III */ 58*a9a98258SWilly Tu virtual int bind_sock(int sockfd) const = 0; 591285115cSWilliam A. Kennington III 601285115cSWilliam A. Kennington III protected: 611285115cSWilliam A. Kennington III std::string name_; 621285115cSWilliam A. Kennington III 631285115cSWilliam A. Kennington III private: 641285115cSWilliam A. Kennington III /** @brief Similar to ioctl syscall, but the socket is created inside 651285115cSWilliam A. Kennington III * the function and the interface name in struct ifreq is 661285115cSWilliam A. Kennington III * properly populated with the index of this interface. 671285115cSWilliam A. Kennington III */ 681285115cSWilliam A. Kennington III virtual int ioctl(int request, struct ifreq* ifr) const = 0; 691285115cSWilliam A. Kennington III 701285115cSWilliam A. Kennington III /** @brief Similar to ioctl syscall. The interface index in 711285115cSWilliam A. Kennington III * struct ifreq is 721285115cSWilliam A. Kennington III * properly populated with the index of this interface. 731285115cSWilliam A. Kennington III */ 741285115cSWilliam A. Kennington III virtual int ioctl_sock(int sockfd, int request, 751285115cSWilliam A. Kennington III struct ifreq* ifr) const = 0; 761285115cSWilliam A. Kennington III 771285115cSWilliam A. Kennington III /** @brief Modify interface flags, using the given socket for 781285115cSWilliam A. Kennington III * ioctl call. 791285115cSWilliam A. Kennington III */ 801285115cSWilliam A. Kennington III int mod_sock_flags(int sockfd, short flags, bool set) const; 811285115cSWilliam A. Kennington III }; 821285115cSWilliam A. Kennington III 831285115cSWilliam A. Kennington III class IFace : public IFaceBase 841285115cSWilliam A. Kennington III { 851285115cSWilliam A. Kennington III public: IFace(const std::string & name)862be45238SPatrick Williams explicit IFace(const std::string& name) : IFaceBase(name) {} 871285115cSWilliam A. Kennington III 881285115cSWilliam A. Kennington III /** @brief Bind given socket to this interface. Similar to bind 891285115cSWilliam A. Kennington III * syscall, except that it fills in sll_ifindex field 901285115cSWilliam A. Kennington III * of struct sockaddr_ll with the index of this interface. 911285115cSWilliam A. Kennington III */ 92*a9a98258SWilly Tu int bind_sock(int sockfd) const override; 931285115cSWilliam A. Kennington III 941285115cSWilliam A. Kennington III private: 951285115cSWilliam A. Kennington III /** @brief Similar to ioctl syscall, but the socket is created inside 961285115cSWilliam A. Kennington III * the function and the interface name in struct ifreq is 971285115cSWilliam A. Kennington III * properly populated with the index of this interface. 981285115cSWilliam A. Kennington III */ 991285115cSWilliam A. Kennington III int ioctl(int request, struct ifreq* ifr) const override; 1001285115cSWilliam A. Kennington III /** @brief Similar to ioctl syscall. The interface index in 1011285115cSWilliam A. Kennington III * struct ifreq is 1021285115cSWilliam A. Kennington III * properly populated with the index of this interface. 1031285115cSWilliam A. Kennington III */ 1041285115cSWilliam A. Kennington III int ioctl_sock(int sockfd, int request, struct ifreq* ifr) const override; 1051285115cSWilliam A. Kennington III }; 1061285115cSWilliam A. Kennington III 1071285115cSWilliam A. Kennington III } // namespace net 108