1 /* 2 * Copyright (C) 2007-2016 Red Hat, Inc. 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library. If not, see 16 * <http://www.gnu.org/licenses/>. 17 */ 18 19 #pragma once 20 21 #include "virbitmap.h" 22 #include "virsocketaddr.h" 23 #include "virmacaddr.h" 24 #include "virpci.h" 25 #include "virnetdevvlan.h" 26 #include "virenum.h" 27 28 #ifdef WITH_NET_IF_H 29 # include <net/if.h> 30 #endif 31 32 #ifdef WITH_STRUCT_IFREQ 33 typedef struct ifreq virIfreq; 34 #else 35 typedef void virIfreq; 36 #endif 37 38 /* Used for prefix of ifname of any tap device name generated 39 * dynamically by libvirt, cannot be used for a persistent network name. 40 */ 41 #define VIR_NET_GENERATED_VNET_PREFIX "vnet" 42 43 /* libvirt will start macvtap/macvlan interface names with one of 44 * these prefixes when it auto-generates the name 45 */ 46 #define VIR_NET_GENERATED_MACVTAP_PREFIX "macvtap" 47 #define VIR_NET_GENERATED_MACVLAN_PREFIX "macvlan" 48 49 typedef enum { 50 VIR_NETDEV_RX_FILTER_MODE_NONE = 0, 51 VIR_NETDEV_RX_FILTER_MODE_NORMAL, 52 VIR_NETDEV_RX_FILTER_MODE_ALL, 53 54 VIR_NETDEV_RX_FILTER_MODE_LAST 55 } virNetDevRxFilterMode; 56 VIR_ENUM_DECL(virNetDevRxFilterMode); 57 58 typedef struct _virNetDevRxFilter virNetDevRxFilter; 59 struct _virNetDevRxFilter { 60 char *name; /* the alias used by qemu, *not* name used by guest */ 61 virMacAddr mac; 62 bool promiscuous; 63 bool broadcastAllowed; 64 65 struct { 66 int mode; /* enum virNetDevRxFilterMode */ 67 bool overflow; 68 virMacAddr *table; 69 size_t nTable; 70 } unicast; 71 struct { 72 int mode; /* enum virNetDevRxFilterMode */ 73 bool overflow; 74 virMacAddr *table; 75 size_t nTable; 76 } multicast; 77 struct { 78 int mode; /* enum virNetDevRxFilterMode */ 79 unsigned int *table; 80 size_t nTable; 81 } vlan; 82 }; 83 84 typedef enum { 85 VIR_NETDEV_IF_STATE_UNKNOWN = 1, 86 VIR_NETDEV_IF_STATE_NOT_PRESENT, 87 VIR_NETDEV_IF_STATE_DOWN, 88 VIR_NETDEV_IF_STATE_LOWER_LAYER_DOWN, 89 VIR_NETDEV_IF_STATE_TESTING, 90 VIR_NETDEV_IF_STATE_DORMANT, 91 VIR_NETDEV_IF_STATE_UP, 92 VIR_NETDEV_IF_STATE_LAST 93 } virNetDevIfState; 94 95 VIR_ENUM_DECL(virNetDevIfState); 96 97 typedef struct _virNetDevIfLink virNetDevIfLink; 98 struct _virNetDevIfLink { 99 virNetDevIfState state; /* link state */ 100 unsigned int speed; /* link speed in Mbits per second */ 101 }; 102 103 typedef enum { 104 VIR_NET_DEV_FEAT_GRXCSUM, 105 VIR_NET_DEV_FEAT_GTXCSUM, 106 VIR_NET_DEV_FEAT_GSG, 107 VIR_NET_DEV_FEAT_GTSO, 108 VIR_NET_DEV_FEAT_GGSO, 109 VIR_NET_DEV_FEAT_GGRO, 110 VIR_NET_DEV_FEAT_LRO, 111 VIR_NET_DEV_FEAT_RXVLAN, 112 VIR_NET_DEV_FEAT_TXVLAN, 113 VIR_NET_DEV_FEAT_NTUPLE, 114 VIR_NET_DEV_FEAT_RXHASH, 115 VIR_NET_DEV_FEAT_RDMA, 116 VIR_NET_DEV_FEAT_TXUDPTNL, 117 VIR_NET_DEV_FEAT_SWITCHDEV, 118 VIR_NET_DEV_FEAT_LAST 119 } virNetDevFeature; 120 121 VIR_ENUM_DECL(virNetDevFeature); 122 123 /* Modeled after struct ethtool_coalesce, see linux/ethtool.h for explanations 124 * of particular fields */ 125 typedef struct _virNetDevCoalesce virNetDevCoalesce; 126 struct _virNetDevCoalesce { 127 uint32_t rx_coalesce_usecs; 128 uint32_t rx_max_coalesced_frames; 129 uint32_t rx_coalesce_usecs_irq; 130 uint32_t rx_max_coalesced_frames_irq; 131 uint32_t tx_coalesce_usecs; 132 uint32_t tx_max_coalesced_frames; 133 uint32_t tx_coalesce_usecs_irq; 134 uint32_t tx_max_coalesced_frames_irq; 135 uint32_t stats_block_coalesce_usecs; 136 uint32_t use_adaptive_rx_coalesce; 137 uint32_t use_adaptive_tx_coalesce; 138 uint32_t pkt_rate_low; 139 uint32_t rx_coalesce_usecs_low; 140 uint32_t rx_max_coalesced_frames_low; 141 uint32_t tx_coalesce_usecs_low; 142 uint32_t tx_max_coalesced_frames_low; 143 uint32_t pkt_rate_high; 144 uint32_t rx_coalesce_usecs_high; 145 uint32_t rx_max_coalesced_frames_high; 146 uint32_t tx_coalesce_usecs_high; 147 uint32_t tx_max_coalesced_frames_high; 148 uint32_t rate_sample_interval; 149 }; 150 151 typedef enum { 152 VIR_NET_DEV_GEN_NAME_VNET, 153 VIR_NET_DEV_GEN_NAME_MACVTAP, 154 VIR_NET_DEV_GEN_NAME_MACVLAN, 155 VIR_NET_DEV_GEN_NAME_LAST 156 } virNetDevGenNameType; 157 158 typedef struct _virNetDevGenName virNetDevGenName; 159 struct _virNetDevGenName { 160 int lastID; /* not "unsigned" because callers use %d */ 161 const char *prefix; 162 virMutex mutex; 163 }; 164 165 166 int virNetDevSetupControl(const char *ifname, 167 virIfreq *ifr) 168 G_GNUC_WARN_UNUSED_RESULT; 169 170 int virNetDevExists(const char *brname) 171 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT G_GNUC_NO_INLINE; 172 173 int virNetDevSetOnline(const char *ifname, 174 bool online) 175 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT G_GNUC_NO_INLINE; 176 int virNetDevGetOnline(const char *ifname, 177 bool *online) 178 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 179 180 181 int virNetDevSetMAC(const char *ifname, 182 const virMacAddr *macaddr) 183 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT G_GNUC_NO_INLINE; 184 int virNetDevGetMAC(const char *ifname, 185 virMacAddr *macaddr) 186 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 187 188 int virNetDevReplaceMacAddress(const char *linkdev, 189 const virMacAddr *macaddress, 190 const char *stateDir) 191 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) 192 G_GNUC_WARN_UNUSED_RESULT; 193 194 int virNetDevRestoreMacAddress(const char *linkdev, 195 const char *stateDir) 196 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 197 198 int virNetDevSetCoalesce(const char *ifname, 199 virNetDevCoalesce *coalesce, 200 bool update) 201 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 202 203 int virNetDevSetMTU(const char *ifname, 204 int mtu) 205 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 206 int virNetDevSetMTUFromDevice(const char *ifname, 207 const char *otherifname) 208 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 209 int virNetDevGetMTU(const char *ifname) 210 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 211 int virNetDevSetNamespace(const char *ifname, pid_t pidInNs) 212 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 213 int virNetDevSetName(const char *ifname, const char *newifname) 214 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 215 216 char *virNetDevGetName(int ifindex) 217 G_GNUC_WARN_UNUSED_RESULT; 218 int virNetDevGetIndex(const char *ifname, int *ifindex) 219 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 220 221 int virNetDevGetVLanID(const char *ifname, int *vlanid) 222 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 223 224 int virNetDevGetMaster(const char *ifname, char **master) 225 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 226 227 int virNetDevValidateConfig(const char *ifname, 228 const virMacAddr *macaddr, int ifindex) 229 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 230 231 int virNetDevIsVirtualFunction(const char *ifname) 232 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 233 234 int virNetDevGetVirtualFunctionIndex(const char *pfname, const char *vfname, 235 int *vf_index) 236 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) 237 G_GNUC_WARN_UNUSED_RESULT; 238 239 int virNetDevGetPhysicalFunction(const char *ifname, char **pfname) 240 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 241 242 int virNetDevPFGetVF(const char *pfname, int vf, char **vfname) 243 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 244 245 int virNetDevGetPhysPortID(const char *ifname, 246 char **physPortID) 247 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) 248 G_GNUC_WARN_UNUSED_RESULT; 249 int virNetDevGetPhysPortName(const char *ifname, 250 char **physPortName) 251 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) 252 G_GNUC_WARN_UNUSED_RESULT; 253 254 int virNetDevGetVirtualFunctions(const char *pfname, 255 virPCIVirtualFunctionList **vfs) 256 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 257 258 int virNetDevSaveNetConfig(const char *linkdev, int vf, 259 const char *stateDir, 260 bool saveVlan) 261 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) G_GNUC_WARN_UNUSED_RESULT; 262 263 int 264 virNetDevReadNetConfig(const char *linkdev, int vf, 265 const char *stateDir, 266 virMacAddr **adminMAC, 267 virNetDevVlan **vlan, 268 virMacAddr **MAC) 269 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4) 270 ATTRIBUTE_NONNULL(5) ATTRIBUTE_NONNULL(6) G_GNUC_WARN_UNUSED_RESULT; 271 272 int 273 virNetDevSetNetConfig(const char *linkdev, int vf, 274 const virMacAddr *adminMAC, 275 const virNetDevVlan *vlan, 276 const virMacAddr *MAC, 277 bool setVLan) 278 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 279 280 int virNetDevGetVirtualFunctionInfo(const char *vfname, char **pfname, 281 int *vf) 282 ATTRIBUTE_NONNULL(1); 283 284 int virNetDevGetFeatures(const char *ifname, 285 virBitmap **out) 286 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 287 288 int virNetDevGetLinkInfo(const char *ifname, 289 virNetDevIfLink *lnk) 290 ATTRIBUTE_NONNULL(1); 291 292 virNetDevRxFilter *virNetDevRxFilterNew(void) 293 G_GNUC_WARN_UNUSED_RESULT; 294 void virNetDevRxFilterFree(virNetDevRxFilter *filter); 295 int virNetDevGetRxFilter(const char *ifname, 296 virNetDevRxFilter **filter) 297 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 298 299 int virNetDevAddMulti(const char *ifname, 300 virMacAddr *macaddr) 301 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 302 int virNetDevDelMulti(const char *ifname, 303 virMacAddr *macaddr) 304 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 305 306 int virNetDevSetPromiscuous(const char *ifname, bool promiscuous) 307 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 308 int virNetDevGetPromiscuous(const char *ifname, bool *promiscuous) 309 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 310 311 int virNetDevSetRcvMulti(const char *ifname, bool receive) 312 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 313 int virNetDevGetRcvMulti(const char *ifname, bool *receive) 314 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 315 316 int virNetDevSetRcvAllMulti(const char *ifname, bool receive) 317 ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; 318 int virNetDevGetRcvAllMulti(const char *ifname, bool *receive) 319 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; 320 321 #define SYSFS_NET_DIR "/sys/class/net/" 322 #define SYSFS_INFINIBAND_DIR "/sys/class/infiniband/" 323 int virNetDevSysfsFile(char **pf_sysfs_device_link, 324 const char *ifname, 325 const char *file) 326 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) 327 G_GNUC_WARN_UNUSED_RESULT G_GNUC_NO_INLINE; 328 329 int virNetDevRunEthernetScript(const char *ifname, const char *script) 330 G_GNUC_NO_INLINE; 331 332 int virNetDevVFInterfaceStats(virPCIDeviceAddress *vfAddr, 333 virDomainInterfaceStatsPtr stats) 334 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); 335 336 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virNetDevRxFilter, virNetDevRxFilterFree); 337 338 void virNetDevReserveName(const char *name); 339 340 int virNetDevGenerateName(char **ifname, virNetDevGenNameType type); 341