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 <net/ethernet.h> 221285115cSWilliam A. Kennington III #include <netinet/in.h> 231285115cSWilliam A. Kennington III #include <sys/ioctl.h> 241285115cSWilliam A. Kennington III #include <sys/socket.h> 251285115cSWilliam A. Kennington III 261285115cSWilliam A. Kennington III #include <functional> 271285115cSWilliam A. Kennington III #include <string> 281285115cSWilliam A. Kennington III 291285115cSWilliam A. Kennington III namespace net 301285115cSWilliam A. Kennington III { 311285115cSWilliam A. Kennington III 321285115cSWilliam A. Kennington III class IFaceBase 331285115cSWilliam A. Kennington III { 341285115cSWilliam A. Kennington III public: 351285115cSWilliam A. Kennington III explicit IFaceBase(const std::string& name); 361285115cSWilliam A. Kennington III virtual ~IFaceBase() = default; 371285115cSWilliam A. Kennington III 381285115cSWilliam A. Kennington III /** @brief Get the index of the network interface corresponding 391285115cSWilliam A. Kennington III * to this object. 401285115cSWilliam A. Kennington III */ 411285115cSWilliam A. Kennington III int get_index() const; 421285115cSWilliam A. Kennington III 431285115cSWilliam A. Kennington III /** @brief Set interface flags using provided socket. 441285115cSWilliam A. Kennington III * 451285115cSWilliam A. Kennington III * @param[in] sockfd - Socket to use for SIOCSIFFLAGS ioctl call. 461285115cSWilliam A. Kennington III * @param[in] flags - Flags to set. 471285115cSWilliam A. Kennington III */ 481285115cSWilliam A. Kennington III int set_sock_flags(int sockfd, short flags) const; 491285115cSWilliam A. Kennington III 501285115cSWilliam A. Kennington III /** @brief Clear interface flags using provided socket. 511285115cSWilliam A. Kennington III * 521285115cSWilliam A. Kennington III * @param[in] sockfd - Socket to use for SIOCSIFFLAGS/SIOCGIFFLAGS 531285115cSWilliam A. Kennington III * ioctl call. 541285115cSWilliam A. Kennington III * @param[in] flags - Flags to clear. 551285115cSWilliam A. Kennington III */ 561285115cSWilliam A. Kennington III int clear_sock_flags(int sockfd, short flags) const; 571285115cSWilliam A. Kennington III 581285115cSWilliam A. Kennington III /** @brief Bind given socket to this interface. Similar to bind 591285115cSWilliam A. Kennington III * syscall, except that it fills in sll_ifindex field 601285115cSWilliam A. Kennington III * of struct sockaddr_ll with the index of this interface. 611285115cSWilliam A. Kennington III */ 621285115cSWilliam A. Kennington III virtual int bind_sock(int sockfd, struct sockaddr_ll* saddr) const = 0; 631285115cSWilliam A. Kennington III 641285115cSWilliam A. Kennington III protected: 651285115cSWilliam A. Kennington III std::string name_; 661285115cSWilliam A. Kennington III 671285115cSWilliam A. Kennington III private: 681285115cSWilliam A. Kennington III /** @brief Similar to ioctl syscall, but the socket is created inside 691285115cSWilliam A. Kennington III * the function and the interface name in struct ifreq is 701285115cSWilliam A. Kennington III * properly populated with the index of this interface. 711285115cSWilliam A. Kennington III */ 721285115cSWilliam A. Kennington III virtual int ioctl(int request, struct ifreq* ifr) const = 0; 731285115cSWilliam A. Kennington III 741285115cSWilliam A. Kennington III /** @brief Similar to ioctl syscall. The interface index in 751285115cSWilliam A. Kennington III * struct ifreq is 761285115cSWilliam A. Kennington III * properly populated with the index of this interface. 771285115cSWilliam A. Kennington III */ 781285115cSWilliam A. Kennington III virtual int ioctl_sock(int sockfd, int request, 791285115cSWilliam A. Kennington III struct ifreq* ifr) const = 0; 801285115cSWilliam A. Kennington III 811285115cSWilliam A. Kennington III /** @brief Modify interface flags, using the given socket for 821285115cSWilliam A. Kennington III * ioctl call. 831285115cSWilliam A. Kennington III */ 841285115cSWilliam A. Kennington III int mod_sock_flags(int sockfd, short flags, bool set) const; 851285115cSWilliam A. Kennington III }; 861285115cSWilliam A. Kennington III 871285115cSWilliam A. Kennington III class IFace : public IFaceBase 881285115cSWilliam A. Kennington III { 891285115cSWilliam A. Kennington III public: 90*2be45238SPatrick Williams explicit IFace(const std::string& name) : IFaceBase(name) {} 911285115cSWilliam A. Kennington III 921285115cSWilliam A. Kennington III /** @brief Bind given socket to this interface. Similar to bind 931285115cSWilliam A. Kennington III * syscall, except that it fills in sll_ifindex field 941285115cSWilliam A. Kennington III * of struct sockaddr_ll with the index of this interface. 951285115cSWilliam A. Kennington III */ 961285115cSWilliam A. Kennington III int bind_sock(int sockfd, struct sockaddr_ll* saddr) const override; 971285115cSWilliam A. Kennington III 981285115cSWilliam A. Kennington III private: 991285115cSWilliam A. Kennington III /** @brief Similar to ioctl syscall, but the socket is created inside 1001285115cSWilliam A. Kennington III * the function and the interface name in struct ifreq is 1011285115cSWilliam A. Kennington III * properly populated with the index of this interface. 1021285115cSWilliam A. Kennington III */ 1031285115cSWilliam A. Kennington III int ioctl(int request, struct ifreq* ifr) const override; 1041285115cSWilliam A. Kennington III /** @brief Similar to ioctl syscall. The interface index in 1051285115cSWilliam A. Kennington III * struct ifreq is 1061285115cSWilliam A. Kennington III * properly populated with the index of this interface. 1071285115cSWilliam A. Kennington III */ 1081285115cSWilliam A. Kennington III int ioctl_sock(int sockfd, int request, struct ifreq* ifr) const override; 1091285115cSWilliam A. Kennington III }; 1101285115cSWilliam A. Kennington III 1111285115cSWilliam A. Kennington III } // namespace net 112