1 /* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License as published by 4 * the Free Software Foundation; either version 2 of the License, or 5 * (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, see <http://www.gnu.org/licenses/>. 14 */ 15 16 #include "qemu/osdep.h" 17 18 #include <sys/signalfd.h> 19 #include <linux/unistd.h> 20 #include <linux/audit.h> 21 #ifdef CONFIG_INOTIFY 22 #include <sys/inotify.h> 23 #endif 24 #include <linux/netlink.h> 25 #ifdef CONFIG_RTNETLINK 26 #include <linux/rtnetlink.h> 27 #include <linux/if_bridge.h> 28 #endif 29 #include "qemu.h" 30 #include "user-internals.h" 31 #include "fd-trans.h" 32 #include "signal-common.h" 33 34 enum { 35 QEMU_IFLA_BR_UNSPEC, 36 QEMU_IFLA_BR_FORWARD_DELAY, 37 QEMU_IFLA_BR_HELLO_TIME, 38 QEMU_IFLA_BR_MAX_AGE, 39 QEMU_IFLA_BR_AGEING_TIME, 40 QEMU_IFLA_BR_STP_STATE, 41 QEMU_IFLA_BR_PRIORITY, 42 QEMU_IFLA_BR_VLAN_FILTERING, 43 QEMU_IFLA_BR_VLAN_PROTOCOL, 44 QEMU_IFLA_BR_GROUP_FWD_MASK, 45 QEMU_IFLA_BR_ROOT_ID, 46 QEMU_IFLA_BR_BRIDGE_ID, 47 QEMU_IFLA_BR_ROOT_PORT, 48 QEMU_IFLA_BR_ROOT_PATH_COST, 49 QEMU_IFLA_BR_TOPOLOGY_CHANGE, 50 QEMU_IFLA_BR_TOPOLOGY_CHANGE_DETECTED, 51 QEMU_IFLA_BR_HELLO_TIMER, 52 QEMU_IFLA_BR_TCN_TIMER, 53 QEMU_IFLA_BR_TOPOLOGY_CHANGE_TIMER, 54 QEMU_IFLA_BR_GC_TIMER, 55 QEMU_IFLA_BR_GROUP_ADDR, 56 QEMU_IFLA_BR_FDB_FLUSH, 57 QEMU_IFLA_BR_MCAST_ROUTER, 58 QEMU_IFLA_BR_MCAST_SNOOPING, 59 QEMU_IFLA_BR_MCAST_QUERY_USE_IFADDR, 60 QEMU_IFLA_BR_MCAST_QUERIER, 61 QEMU_IFLA_BR_MCAST_HASH_ELASTICITY, 62 QEMU_IFLA_BR_MCAST_HASH_MAX, 63 QEMU_IFLA_BR_MCAST_LAST_MEMBER_CNT, 64 QEMU_IFLA_BR_MCAST_STARTUP_QUERY_CNT, 65 QEMU_IFLA_BR_MCAST_LAST_MEMBER_INTVL, 66 QEMU_IFLA_BR_MCAST_MEMBERSHIP_INTVL, 67 QEMU_IFLA_BR_MCAST_QUERIER_INTVL, 68 QEMU_IFLA_BR_MCAST_QUERY_INTVL, 69 QEMU_IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, 70 QEMU_IFLA_BR_MCAST_STARTUP_QUERY_INTVL, 71 QEMU_IFLA_BR_NF_CALL_IPTABLES, 72 QEMU_IFLA_BR_NF_CALL_IP6TABLES, 73 QEMU_IFLA_BR_NF_CALL_ARPTABLES, 74 QEMU_IFLA_BR_VLAN_DEFAULT_PVID, 75 QEMU_IFLA_BR_PAD, 76 QEMU_IFLA_BR_VLAN_STATS_ENABLED, 77 QEMU_IFLA_BR_MCAST_STATS_ENABLED, 78 QEMU_IFLA_BR_MCAST_IGMP_VERSION, 79 QEMU_IFLA_BR_MCAST_MLD_VERSION, 80 QEMU_IFLA_BR_VLAN_STATS_PER_PORT, 81 QEMU_IFLA_BR_MULTI_BOOLOPT, 82 QEMU___IFLA_BR_MAX, 83 }; 84 85 enum { 86 QEMU_IFLA_UNSPEC, 87 QEMU_IFLA_ADDRESS, 88 QEMU_IFLA_BROADCAST, 89 QEMU_IFLA_IFNAME, 90 QEMU_IFLA_MTU, 91 QEMU_IFLA_LINK, 92 QEMU_IFLA_QDISC, 93 QEMU_IFLA_STATS, 94 QEMU_IFLA_COST, 95 QEMU_IFLA_PRIORITY, 96 QEMU_IFLA_MASTER, 97 QEMU_IFLA_WIRELESS, 98 QEMU_IFLA_PROTINFO, 99 QEMU_IFLA_TXQLEN, 100 QEMU_IFLA_MAP, 101 QEMU_IFLA_WEIGHT, 102 QEMU_IFLA_OPERSTATE, 103 QEMU_IFLA_LINKMODE, 104 QEMU_IFLA_LINKINFO, 105 QEMU_IFLA_NET_NS_PID, 106 QEMU_IFLA_IFALIAS, 107 QEMU_IFLA_NUM_VF, 108 QEMU_IFLA_VFINFO_LIST, 109 QEMU_IFLA_STATS64, 110 QEMU_IFLA_VF_PORTS, 111 QEMU_IFLA_PORT_SELF, 112 QEMU_IFLA_AF_SPEC, 113 QEMU_IFLA_GROUP, 114 QEMU_IFLA_NET_NS_FD, 115 QEMU_IFLA_EXT_MASK, 116 QEMU_IFLA_PROMISCUITY, 117 QEMU_IFLA_NUM_TX_QUEUES, 118 QEMU_IFLA_NUM_RX_QUEUES, 119 QEMU_IFLA_CARRIER, 120 QEMU_IFLA_PHYS_PORT_ID, 121 QEMU_IFLA_CARRIER_CHANGES, 122 QEMU_IFLA_PHYS_SWITCH_ID, 123 QEMU_IFLA_LINK_NETNSID, 124 QEMU_IFLA_PHYS_PORT_NAME, 125 QEMU_IFLA_PROTO_DOWN, 126 QEMU_IFLA_GSO_MAX_SEGS, 127 QEMU_IFLA_GSO_MAX_SIZE, 128 QEMU_IFLA_PAD, 129 QEMU_IFLA_XDP, 130 QEMU_IFLA_EVENT, 131 QEMU_IFLA_NEW_NETNSID, 132 QEMU_IFLA_IF_NETNSID, 133 QEMU_IFLA_CARRIER_UP_COUNT, 134 QEMU_IFLA_CARRIER_DOWN_COUNT, 135 QEMU_IFLA_NEW_IFINDEX, 136 QEMU_IFLA_MIN_MTU, 137 QEMU_IFLA_MAX_MTU, 138 QEMU_IFLA_PROP_LIST, 139 QEMU_IFLA_ALT_IFNAME, 140 QEMU_IFLA_PERM_ADDRESS, 141 QEMU_IFLA_PROTO_DOWN_REASON, 142 QEMU_IFLA_PARENT_DEV_NAME, 143 QEMU_IFLA_PARENT_DEV_BUS_NAME, 144 QEMU___IFLA_MAX 145 }; 146 147 enum { 148 QEMU_IFLA_BRPORT_UNSPEC, 149 QEMU_IFLA_BRPORT_STATE, 150 QEMU_IFLA_BRPORT_PRIORITY, 151 QEMU_IFLA_BRPORT_COST, 152 QEMU_IFLA_BRPORT_MODE, 153 QEMU_IFLA_BRPORT_GUARD, 154 QEMU_IFLA_BRPORT_PROTECT, 155 QEMU_IFLA_BRPORT_FAST_LEAVE, 156 QEMU_IFLA_BRPORT_LEARNING, 157 QEMU_IFLA_BRPORT_UNICAST_FLOOD, 158 QEMU_IFLA_BRPORT_PROXYARP, 159 QEMU_IFLA_BRPORT_LEARNING_SYNC, 160 QEMU_IFLA_BRPORT_PROXYARP_WIFI, 161 QEMU_IFLA_BRPORT_ROOT_ID, 162 QEMU_IFLA_BRPORT_BRIDGE_ID, 163 QEMU_IFLA_BRPORT_DESIGNATED_PORT, 164 QEMU_IFLA_BRPORT_DESIGNATED_COST, 165 QEMU_IFLA_BRPORT_ID, 166 QEMU_IFLA_BRPORT_NO, 167 QEMU_IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, 168 QEMU_IFLA_BRPORT_CONFIG_PENDING, 169 QEMU_IFLA_BRPORT_MESSAGE_AGE_TIMER, 170 QEMU_IFLA_BRPORT_FORWARD_DELAY_TIMER, 171 QEMU_IFLA_BRPORT_HOLD_TIMER, 172 QEMU_IFLA_BRPORT_FLUSH, 173 QEMU_IFLA_BRPORT_MULTICAST_ROUTER, 174 QEMU_IFLA_BRPORT_PAD, 175 QEMU_IFLA_BRPORT_MCAST_FLOOD, 176 QEMU_IFLA_BRPORT_MCAST_TO_UCAST, 177 QEMU_IFLA_BRPORT_VLAN_TUNNEL, 178 QEMU_IFLA_BRPORT_BCAST_FLOOD, 179 QEMU_IFLA_BRPORT_GROUP_FWD_MASK, 180 QEMU_IFLA_BRPORT_NEIGH_SUPPRESS, 181 QEMU_IFLA_BRPORT_ISOLATED, 182 QEMU_IFLA_BRPORT_BACKUP_PORT, 183 QEMU_IFLA_BRPORT_MRP_RING_OPEN, 184 QEMU_IFLA_BRPORT_MRP_IN_OPEN, 185 QEMU_IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT, 186 QEMU_IFLA_BRPORT_MCAST_EHT_HOSTS_CNT, 187 QEMU___IFLA_BRPORT_MAX 188 }; 189 190 enum { 191 QEMU_IFLA_TUN_UNSPEC, 192 QEMU_IFLA_TUN_OWNER, 193 QEMU_IFLA_TUN_GROUP, 194 QEMU_IFLA_TUN_TYPE, 195 QEMU_IFLA_TUN_PI, 196 QEMU_IFLA_TUN_VNET_HDR, 197 QEMU_IFLA_TUN_PERSIST, 198 QEMU_IFLA_TUN_MULTI_QUEUE, 199 QEMU_IFLA_TUN_NUM_QUEUES, 200 QEMU_IFLA_TUN_NUM_DISABLED_QUEUES, 201 QEMU___IFLA_TUN_MAX, 202 }; 203 204 enum { 205 QEMU_IFLA_INFO_UNSPEC, 206 QEMU_IFLA_INFO_KIND, 207 QEMU_IFLA_INFO_DATA, 208 QEMU_IFLA_INFO_XSTATS, 209 QEMU_IFLA_INFO_SLAVE_KIND, 210 QEMU_IFLA_INFO_SLAVE_DATA, 211 QEMU___IFLA_INFO_MAX, 212 }; 213 214 enum { 215 QEMU_IFLA_INET_UNSPEC, 216 QEMU_IFLA_INET_CONF, 217 QEMU___IFLA_INET_MAX, 218 }; 219 220 enum { 221 QEMU_IFLA_INET6_UNSPEC, 222 QEMU_IFLA_INET6_FLAGS, 223 QEMU_IFLA_INET6_CONF, 224 QEMU_IFLA_INET6_STATS, 225 QEMU_IFLA_INET6_MCAST, 226 QEMU_IFLA_INET6_CACHEINFO, 227 QEMU_IFLA_INET6_ICMP6STATS, 228 QEMU_IFLA_INET6_TOKEN, 229 QEMU_IFLA_INET6_ADDR_GEN_MODE, 230 QEMU___IFLA_INET6_MAX 231 }; 232 233 enum { 234 QEMU_IFLA_XDP_UNSPEC, 235 QEMU_IFLA_XDP_FD, 236 QEMU_IFLA_XDP_ATTACHED, 237 QEMU_IFLA_XDP_FLAGS, 238 QEMU_IFLA_XDP_PROG_ID, 239 QEMU___IFLA_XDP_MAX, 240 }; 241 242 enum { 243 QEMU_RTA_UNSPEC, 244 QEMU_RTA_DST, 245 QEMU_RTA_SRC, 246 QEMU_RTA_IIF, 247 QEMU_RTA_OIF, 248 QEMU_RTA_GATEWAY, 249 QEMU_RTA_PRIORITY, 250 QEMU_RTA_PREFSRC, 251 QEMU_RTA_METRICS, 252 QEMU_RTA_MULTIPATH, 253 QEMU_RTA_PROTOINFO, /* no longer used */ 254 QEMU_RTA_FLOW, 255 QEMU_RTA_CACHEINFO, 256 QEMU_RTA_SESSION, /* no longer used */ 257 QEMU_RTA_MP_ALGO, /* no longer used */ 258 QEMU_RTA_TABLE, 259 QEMU_RTA_MARK, 260 QEMU_RTA_MFC_STATS, 261 QEMU_RTA_VIA, 262 QEMU_RTA_NEWDST, 263 QEMU_RTA_PREF, 264 QEMU_RTA_ENCAP_TYPE, 265 QEMU_RTA_ENCAP, 266 QEMU_RTA_EXPIRES, 267 QEMU_RTA_PAD, 268 QEMU_RTA_UID, 269 QEMU_RTA_TTL_PROPAGATE, 270 QEMU_RTA_IP_PROTO, 271 QEMU_RTA_SPORT, 272 QEMU_RTA_DPORT, 273 QEMU___RTA_MAX 274 }; 275 276 enum { 277 QEMU_IFLA_VF_STATS_RX_PACKETS, 278 QEMU_IFLA_VF_STATS_TX_PACKETS, 279 QEMU_IFLA_VF_STATS_RX_BYTES, 280 QEMU_IFLA_VF_STATS_TX_BYTES, 281 QEMU_IFLA_VF_STATS_BROADCAST, 282 QEMU_IFLA_VF_STATS_MULTICAST, 283 QEMU_IFLA_VF_STATS_PAD, 284 QEMU_IFLA_VF_STATS_RX_DROPPED, 285 QEMU_IFLA_VF_STATS_TX_DROPPED, 286 QEMU__IFLA_VF_STATS_MAX, 287 }; 288 289 enum { 290 QEMU_IFLA_VF_UNSPEC, 291 QEMU_IFLA_VF_MAC, 292 QEMU_IFLA_VF_VLAN, 293 QEMU_IFLA_VF_TX_RATE, 294 QEMU_IFLA_VF_SPOOFCHK, 295 QEMU_IFLA_VF_LINK_STATE, 296 QEMU_IFLA_VF_RATE, 297 QEMU_IFLA_VF_RSS_QUERY_EN, 298 QEMU_IFLA_VF_STATS, 299 QEMU_IFLA_VF_TRUST, 300 QEMU_IFLA_VF_IB_NODE_GUID, 301 QEMU_IFLA_VF_IB_PORT_GUID, 302 QEMU_IFLA_VF_VLAN_LIST, 303 QEMU_IFLA_VF_BROADCAST, 304 QEMU__IFLA_VF_MAX, 305 }; 306 307 TargetFdTrans **target_fd_trans; 308 QemuMutex target_fd_trans_lock; 309 unsigned int target_fd_max; 310 311 static void tswap_nlmsghdr(struct nlmsghdr *nlh) 312 { 313 nlh->nlmsg_len = tswap32(nlh->nlmsg_len); 314 nlh->nlmsg_type = tswap16(nlh->nlmsg_type); 315 nlh->nlmsg_flags = tswap16(nlh->nlmsg_flags); 316 nlh->nlmsg_seq = tswap32(nlh->nlmsg_seq); 317 nlh->nlmsg_pid = tswap32(nlh->nlmsg_pid); 318 } 319 320 static abi_long host_to_target_for_each_nlmsg(struct nlmsghdr *nlh, 321 size_t len, 322 abi_long (*host_to_target_nlmsg) 323 (struct nlmsghdr *)) 324 { 325 uint32_t nlmsg_len; 326 uint32_t aligned_nlmsg_len; 327 abi_long ret; 328 329 while (len > sizeof(struct nlmsghdr)) { 330 331 nlmsg_len = nlh->nlmsg_len; 332 if (nlmsg_len < sizeof(struct nlmsghdr) || 333 nlmsg_len > len) { 334 break; 335 } 336 337 switch (nlh->nlmsg_type) { 338 case NLMSG_DONE: 339 tswap_nlmsghdr(nlh); 340 return 0; 341 case NLMSG_NOOP: 342 break; 343 case NLMSG_ERROR: 344 { 345 struct nlmsgerr *e = NLMSG_DATA(nlh); 346 e->error = tswap32(e->error); 347 tswap_nlmsghdr(&e->msg); 348 tswap_nlmsghdr(nlh); 349 return 0; 350 } 351 default: 352 ret = host_to_target_nlmsg(nlh); 353 if (ret < 0) { 354 tswap_nlmsghdr(nlh); 355 return ret; 356 } 357 break; 358 } 359 tswap_nlmsghdr(nlh); 360 361 aligned_nlmsg_len = NLMSG_ALIGN(nlmsg_len); 362 if (aligned_nlmsg_len >= len) { 363 break; 364 } 365 len -= aligned_nlmsg_len; 366 nlh = (struct nlmsghdr *)(((char*)nlh) + aligned_nlmsg_len); 367 } 368 return 0; 369 } 370 371 static abi_long target_to_host_for_each_nlmsg(struct nlmsghdr *nlh, 372 size_t len, 373 abi_long (*target_to_host_nlmsg) 374 (struct nlmsghdr *)) 375 { 376 uint32_t aligned_nlmsg_len; 377 int ret; 378 379 while (len > sizeof(struct nlmsghdr)) { 380 if (tswap32(nlh->nlmsg_len) < sizeof(struct nlmsghdr) || 381 tswap32(nlh->nlmsg_len) > len) { 382 break; 383 } 384 tswap_nlmsghdr(nlh); 385 switch (nlh->nlmsg_type) { 386 case NLMSG_DONE: 387 return 0; 388 case NLMSG_NOOP: 389 break; 390 case NLMSG_ERROR: 391 { 392 struct nlmsgerr *e = NLMSG_DATA(nlh); 393 e->error = tswap32(e->error); 394 tswap_nlmsghdr(&e->msg); 395 return 0; 396 } 397 default: 398 ret = target_to_host_nlmsg(nlh); 399 if (ret < 0) { 400 return ret; 401 } 402 } 403 404 aligned_nlmsg_len = NLMSG_ALIGN(nlh->nlmsg_len); 405 if (aligned_nlmsg_len >= len) { 406 break; 407 } 408 len -= aligned_nlmsg_len; 409 nlh = (struct nlmsghdr *)(((char *)nlh) + aligned_nlmsg_len); 410 } 411 return 0; 412 } 413 414 #ifdef CONFIG_RTNETLINK 415 static abi_long host_to_target_for_each_nlattr(struct nlattr *nlattr, 416 size_t len, void *context, 417 abi_long (*host_to_target_nlattr) 418 (struct nlattr *, 419 void *context)) 420 { 421 unsigned short nla_len; 422 unsigned short aligned_nla_len; 423 abi_long ret; 424 425 while (len > sizeof(struct nlattr)) { 426 nla_len = nlattr->nla_len; 427 if (nla_len < sizeof(struct nlattr) || 428 nla_len > len) { 429 break; 430 } 431 ret = host_to_target_nlattr(nlattr, context); 432 nlattr->nla_len = tswap16(nlattr->nla_len); 433 nlattr->nla_type = tswap16(nlattr->nla_type); 434 if (ret < 0) { 435 return ret; 436 } 437 438 aligned_nla_len = NLA_ALIGN(nla_len); 439 if (aligned_nla_len >= len) { 440 break; 441 } 442 len -= aligned_nla_len; 443 nlattr = (struct nlattr *)(((char *)nlattr) + aligned_nla_len); 444 } 445 return 0; 446 } 447 448 static abi_long host_to_target_for_each_rtattr(struct rtattr *rtattr, 449 size_t len, 450 abi_long (*host_to_target_rtattr) 451 (struct rtattr *)) 452 { 453 unsigned short rta_len; 454 unsigned short aligned_rta_len; 455 abi_long ret; 456 457 while (len > sizeof(struct rtattr)) { 458 rta_len = rtattr->rta_len; 459 if (rta_len < sizeof(struct rtattr) || 460 rta_len > len) { 461 break; 462 } 463 ret = host_to_target_rtattr(rtattr); 464 rtattr->rta_len = tswap16(rtattr->rta_len); 465 rtattr->rta_type = tswap16(rtattr->rta_type); 466 if (ret < 0) { 467 return ret; 468 } 469 470 aligned_rta_len = RTA_ALIGN(rta_len); 471 if (aligned_rta_len >= len) { 472 break; 473 } 474 len -= aligned_rta_len; 475 rtattr = (struct rtattr *)(((char *)rtattr) + aligned_rta_len); 476 } 477 return 0; 478 } 479 480 #define NLA_DATA(nla) ((void *)((char *)(nla)) + NLA_HDRLEN) 481 482 static abi_long host_to_target_data_bridge_nlattr(struct nlattr *nlattr, 483 void *context) 484 { 485 uint16_t *u16; 486 uint32_t *u32; 487 uint64_t *u64; 488 489 switch (nlattr->nla_type) { 490 /* no data */ 491 case QEMU_IFLA_BR_FDB_FLUSH: 492 break; 493 /* binary */ 494 case QEMU_IFLA_BR_GROUP_ADDR: 495 break; 496 /* uint8_t */ 497 case QEMU_IFLA_BR_VLAN_FILTERING: 498 case QEMU_IFLA_BR_TOPOLOGY_CHANGE: 499 case QEMU_IFLA_BR_TOPOLOGY_CHANGE_DETECTED: 500 case QEMU_IFLA_BR_MCAST_ROUTER: 501 case QEMU_IFLA_BR_MCAST_SNOOPING: 502 case QEMU_IFLA_BR_MCAST_QUERY_USE_IFADDR: 503 case QEMU_IFLA_BR_MCAST_QUERIER: 504 case QEMU_IFLA_BR_NF_CALL_IPTABLES: 505 case QEMU_IFLA_BR_NF_CALL_IP6TABLES: 506 case QEMU_IFLA_BR_NF_CALL_ARPTABLES: 507 case QEMU_IFLA_BR_VLAN_STATS_ENABLED: 508 case QEMU_IFLA_BR_MCAST_STATS_ENABLED: 509 case QEMU_IFLA_BR_MCAST_IGMP_VERSION: 510 case QEMU_IFLA_BR_MCAST_MLD_VERSION: 511 case QEMU_IFLA_BR_VLAN_STATS_PER_PORT: 512 break; 513 /* uint16_t */ 514 case QEMU_IFLA_BR_PRIORITY: 515 case QEMU_IFLA_BR_VLAN_PROTOCOL: 516 case QEMU_IFLA_BR_GROUP_FWD_MASK: 517 case QEMU_IFLA_BR_ROOT_PORT: 518 case QEMU_IFLA_BR_VLAN_DEFAULT_PVID: 519 u16 = NLA_DATA(nlattr); 520 *u16 = tswap16(*u16); 521 break; 522 /* uint32_t */ 523 case QEMU_IFLA_BR_FORWARD_DELAY: 524 case QEMU_IFLA_BR_HELLO_TIME: 525 case QEMU_IFLA_BR_MAX_AGE: 526 case QEMU_IFLA_BR_AGEING_TIME: 527 case QEMU_IFLA_BR_STP_STATE: 528 case QEMU_IFLA_BR_ROOT_PATH_COST: 529 case QEMU_IFLA_BR_MCAST_HASH_ELASTICITY: 530 case QEMU_IFLA_BR_MCAST_HASH_MAX: 531 case QEMU_IFLA_BR_MCAST_LAST_MEMBER_CNT: 532 case QEMU_IFLA_BR_MCAST_STARTUP_QUERY_CNT: 533 u32 = NLA_DATA(nlattr); 534 *u32 = tswap32(*u32); 535 break; 536 /* uint64_t */ 537 case QEMU_IFLA_BR_HELLO_TIMER: 538 case QEMU_IFLA_BR_TCN_TIMER: 539 case QEMU_IFLA_BR_GC_TIMER: 540 case QEMU_IFLA_BR_TOPOLOGY_CHANGE_TIMER: 541 case QEMU_IFLA_BR_MCAST_LAST_MEMBER_INTVL: 542 case QEMU_IFLA_BR_MCAST_MEMBERSHIP_INTVL: 543 case QEMU_IFLA_BR_MCAST_QUERIER_INTVL: 544 case QEMU_IFLA_BR_MCAST_QUERY_INTVL: 545 case QEMU_IFLA_BR_MCAST_QUERY_RESPONSE_INTVL: 546 case QEMU_IFLA_BR_MCAST_STARTUP_QUERY_INTVL: 547 u64 = NLA_DATA(nlattr); 548 *u64 = tswap64(*u64); 549 break; 550 /* ifla_bridge_id: uin8_t[] */ 551 case QEMU_IFLA_BR_ROOT_ID: 552 case QEMU_IFLA_BR_BRIDGE_ID: 553 break; 554 /* br_boolopt_multi { uint32_t, uint32_t } */ 555 case QEMU_IFLA_BR_MULTI_BOOLOPT: 556 u32 = NLA_DATA(nlattr); 557 u32[0] = tswap32(u32[0]); /* optval */ 558 u32[1] = tswap32(u32[1]); /* optmask */ 559 break; 560 default: 561 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_BR type %d\n", 562 nlattr->nla_type); 563 break; 564 } 565 return 0; 566 } 567 568 static abi_long host_to_target_slave_data_bridge_nlattr(struct nlattr *nlattr, 569 void *context) 570 { 571 uint16_t *u16; 572 uint32_t *u32; 573 uint64_t *u64; 574 575 switch (nlattr->nla_type) { 576 /* uint8_t */ 577 case QEMU_IFLA_BRPORT_STATE: 578 case QEMU_IFLA_BRPORT_MODE: 579 case QEMU_IFLA_BRPORT_GUARD: 580 case QEMU_IFLA_BRPORT_PROTECT: 581 case QEMU_IFLA_BRPORT_FAST_LEAVE: 582 case QEMU_IFLA_BRPORT_LEARNING: 583 case QEMU_IFLA_BRPORT_UNICAST_FLOOD: 584 case QEMU_IFLA_BRPORT_PROXYARP: 585 case QEMU_IFLA_BRPORT_LEARNING_SYNC: 586 case QEMU_IFLA_BRPORT_PROXYARP_WIFI: 587 case QEMU_IFLA_BRPORT_TOPOLOGY_CHANGE_ACK: 588 case QEMU_IFLA_BRPORT_CONFIG_PENDING: 589 case QEMU_IFLA_BRPORT_MULTICAST_ROUTER: 590 case QEMU_IFLA_BRPORT_MCAST_FLOOD: 591 case QEMU_IFLA_BRPORT_MCAST_TO_UCAST: 592 case QEMU_IFLA_BRPORT_VLAN_TUNNEL: 593 case QEMU_IFLA_BRPORT_BCAST_FLOOD: 594 case QEMU_IFLA_BRPORT_NEIGH_SUPPRESS: 595 case QEMU_IFLA_BRPORT_ISOLATED: 596 case QEMU_IFLA_BRPORT_MRP_RING_OPEN: 597 case QEMU_IFLA_BRPORT_MRP_IN_OPEN: 598 break; 599 /* uint16_t */ 600 case QEMU_IFLA_BRPORT_PRIORITY: 601 case QEMU_IFLA_BRPORT_DESIGNATED_PORT: 602 case QEMU_IFLA_BRPORT_DESIGNATED_COST: 603 case QEMU_IFLA_BRPORT_ID: 604 case QEMU_IFLA_BRPORT_NO: 605 case QEMU_IFLA_BRPORT_GROUP_FWD_MASK: 606 u16 = NLA_DATA(nlattr); 607 *u16 = tswap16(*u16); 608 break; 609 /* uin32_t */ 610 case QEMU_IFLA_BRPORT_COST: 611 case QEMU_IFLA_BRPORT_BACKUP_PORT: 612 case QEMU_IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT: 613 case QEMU_IFLA_BRPORT_MCAST_EHT_HOSTS_CNT: 614 u32 = NLA_DATA(nlattr); 615 *u32 = tswap32(*u32); 616 break; 617 /* uint64_t */ 618 case QEMU_IFLA_BRPORT_MESSAGE_AGE_TIMER: 619 case QEMU_IFLA_BRPORT_FORWARD_DELAY_TIMER: 620 case QEMU_IFLA_BRPORT_HOLD_TIMER: 621 u64 = NLA_DATA(nlattr); 622 *u64 = tswap64(*u64); 623 break; 624 /* ifla_bridge_id: uint8_t[] */ 625 case QEMU_IFLA_BRPORT_ROOT_ID: 626 case QEMU_IFLA_BRPORT_BRIDGE_ID: 627 break; 628 default: 629 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_BRPORT type %d\n", 630 nlattr->nla_type); 631 break; 632 } 633 return 0; 634 } 635 636 static abi_long host_to_target_data_tun_nlattr(struct nlattr *nlattr, 637 void *context) 638 { 639 uint32_t *u32; 640 641 switch (nlattr->nla_type) { 642 /* uint8_t */ 643 case QEMU_IFLA_TUN_TYPE: 644 case QEMU_IFLA_TUN_PI: 645 case QEMU_IFLA_TUN_VNET_HDR: 646 case QEMU_IFLA_TUN_PERSIST: 647 case QEMU_IFLA_TUN_MULTI_QUEUE: 648 break; 649 /* uint32_t */ 650 case QEMU_IFLA_TUN_NUM_QUEUES: 651 case QEMU_IFLA_TUN_NUM_DISABLED_QUEUES: 652 case QEMU_IFLA_TUN_OWNER: 653 case QEMU_IFLA_TUN_GROUP: 654 u32 = NLA_DATA(nlattr); 655 *u32 = tswap32(*u32); 656 break; 657 default: 658 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_TUN type %d\n", 659 nlattr->nla_type); 660 break; 661 } 662 return 0; 663 } 664 665 struct linkinfo_context { 666 int len; 667 char *name; 668 int slave_len; 669 char *slave_name; 670 }; 671 672 static abi_long host_to_target_data_linkinfo_nlattr(struct nlattr *nlattr, 673 void *context) 674 { 675 struct linkinfo_context *li_context = context; 676 677 switch (nlattr->nla_type) { 678 /* string */ 679 case QEMU_IFLA_INFO_KIND: 680 li_context->name = NLA_DATA(nlattr); 681 li_context->len = nlattr->nla_len - NLA_HDRLEN; 682 break; 683 case QEMU_IFLA_INFO_SLAVE_KIND: 684 li_context->slave_name = NLA_DATA(nlattr); 685 li_context->slave_len = nlattr->nla_len - NLA_HDRLEN; 686 break; 687 /* stats */ 688 case QEMU_IFLA_INFO_XSTATS: 689 /* FIXME: only used by CAN */ 690 break; 691 /* nested */ 692 case QEMU_IFLA_INFO_DATA: 693 if (strncmp(li_context->name, "bridge", 694 li_context->len) == 0) { 695 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), 696 nlattr->nla_len, 697 NULL, 698 host_to_target_data_bridge_nlattr); 699 } else if (strncmp(li_context->name, "tun", 700 li_context->len) == 0) { 701 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), 702 nlattr->nla_len, 703 NULL, 704 host_to_target_data_tun_nlattr); 705 } else { 706 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_INFO_KIND %s\n", 707 li_context->name); 708 } 709 break; 710 case QEMU_IFLA_INFO_SLAVE_DATA: 711 if (strncmp(li_context->slave_name, "bridge", 712 li_context->slave_len) == 0) { 713 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), 714 nlattr->nla_len, 715 NULL, 716 host_to_target_slave_data_bridge_nlattr); 717 } else { 718 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_INFO_SLAVE_KIND %s\n", 719 li_context->slave_name); 720 } 721 break; 722 default: 723 qemu_log_mask(LOG_UNIMP, "Unknown host QEMU_IFLA_INFO type: %d\n", 724 nlattr->nla_type); 725 break; 726 } 727 728 return 0; 729 } 730 731 static abi_long host_to_target_data_inet_nlattr(struct nlattr *nlattr, 732 void *context) 733 { 734 uint32_t *u32; 735 int i; 736 737 switch (nlattr->nla_type) { 738 case QEMU_IFLA_INET_CONF: 739 u32 = NLA_DATA(nlattr); 740 for (i = 0; i < (nlattr->nla_len - NLA_HDRLEN) / sizeof(*u32); 741 i++) { 742 u32[i] = tswap32(u32[i]); 743 } 744 break; 745 default: 746 qemu_log_mask(LOG_UNIMP, "Unknown host AF_INET type: %d\n", 747 nlattr->nla_type); 748 } 749 return 0; 750 } 751 752 static abi_long host_to_target_data_inet6_nlattr(struct nlattr *nlattr, 753 void *context) 754 { 755 uint32_t *u32; 756 uint64_t *u64; 757 struct ifla_cacheinfo *ci; 758 int i; 759 760 switch (nlattr->nla_type) { 761 /* binaries */ 762 case QEMU_IFLA_INET6_TOKEN: 763 break; 764 /* uint8_t */ 765 case QEMU_IFLA_INET6_ADDR_GEN_MODE: 766 break; 767 /* uint32_t */ 768 case QEMU_IFLA_INET6_FLAGS: 769 u32 = NLA_DATA(nlattr); 770 *u32 = tswap32(*u32); 771 break; 772 /* uint32_t[] */ 773 case QEMU_IFLA_INET6_CONF: 774 u32 = NLA_DATA(nlattr); 775 for (i = 0; i < (nlattr->nla_len - NLA_HDRLEN) / sizeof(*u32); 776 i++) { 777 u32[i] = tswap32(u32[i]); 778 } 779 break; 780 /* ifla_cacheinfo */ 781 case QEMU_IFLA_INET6_CACHEINFO: 782 ci = NLA_DATA(nlattr); 783 ci->max_reasm_len = tswap32(ci->max_reasm_len); 784 ci->tstamp = tswap32(ci->tstamp); 785 ci->reachable_time = tswap32(ci->reachable_time); 786 ci->retrans_time = tswap32(ci->retrans_time); 787 break; 788 /* uint64_t[] */ 789 case QEMU_IFLA_INET6_STATS: 790 case QEMU_IFLA_INET6_ICMP6STATS: 791 u64 = NLA_DATA(nlattr); 792 for (i = 0; i < (nlattr->nla_len - NLA_HDRLEN) / sizeof(*u64); 793 i++) { 794 u64[i] = tswap64(u64[i]); 795 } 796 break; 797 default: 798 qemu_log_mask(LOG_UNIMP, "Unknown host AF_INET6 type: %d\n", 799 nlattr->nla_type); 800 } 801 return 0; 802 } 803 804 static abi_long host_to_target_data_spec_nlattr(struct nlattr *nlattr, 805 void *context) 806 { 807 switch (nlattr->nla_type) { 808 case AF_INET: 809 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len, 810 NULL, 811 host_to_target_data_inet_nlattr); 812 case AF_INET6: 813 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len, 814 NULL, 815 host_to_target_data_inet6_nlattr); 816 default: 817 qemu_log_mask(LOG_UNIMP, "Unknown host AF_SPEC type: %d\n", 818 nlattr->nla_type); 819 break; 820 } 821 return 0; 822 } 823 824 static abi_long host_to_target_data_xdp_nlattr(struct nlattr *nlattr, 825 void *context) 826 { 827 uint32_t *u32; 828 829 switch (nlattr->nla_type) { 830 /* uint8_t */ 831 case QEMU_IFLA_XDP_ATTACHED: 832 break; 833 /* uint32_t */ 834 case QEMU_IFLA_XDP_PROG_ID: 835 u32 = NLA_DATA(nlattr); 836 *u32 = tswap32(*u32); 837 break; 838 default: 839 qemu_log_mask( 840 LOG_UNIMP, "Unknown host XDP type: %d\n", nlattr->nla_type); 841 break; 842 } 843 return 0; 844 } 845 846 static abi_long host_to_target_data_vlan_list_nlattr(struct nlattr *nlattr, 847 void *context) 848 { 849 struct ifla_vf_vlan_info *vlan_info; 850 851 switch (nlattr->nla_type) { 852 /* struct ifla_vf_vlan_info */ 853 case IFLA_VF_VLAN_INFO: 854 vlan_info = NLA_DATA(nlattr); 855 vlan_info->vf = tswap32(vlan_info->vf); 856 vlan_info->vlan = tswap32(vlan_info->vlan); 857 vlan_info->qos = tswap32(vlan_info->qos); 858 break; 859 default: 860 qemu_log_mask(LOG_UNIMP, "Unknown host VLAN LIST type: %d\n", 861 nlattr->nla_type); 862 break; 863 } 864 return 0; 865 } 866 867 static abi_long host_to_target_data_vf_stats_nlattr(struct nlattr *nlattr, 868 void *context) 869 { 870 uint64_t *u64; 871 872 switch (nlattr->nla_type) { 873 /* uint64_t */ 874 case QEMU_IFLA_VF_STATS_RX_PACKETS: 875 case QEMU_IFLA_VF_STATS_TX_PACKETS: 876 case QEMU_IFLA_VF_STATS_RX_BYTES: 877 case QEMU_IFLA_VF_STATS_TX_BYTES: 878 case QEMU_IFLA_VF_STATS_BROADCAST: 879 case QEMU_IFLA_VF_STATS_MULTICAST: 880 case QEMU_IFLA_VF_STATS_PAD: 881 case QEMU_IFLA_VF_STATS_RX_DROPPED: 882 case QEMU_IFLA_VF_STATS_TX_DROPPED: 883 u64 = NLA_DATA(nlattr); 884 *u64 = tswap64(*u64); 885 break; 886 default: 887 qemu_log_mask(LOG_UNIMP, "Unknown host VF STATS type: %d\n", 888 nlattr->nla_type); 889 break; 890 } 891 return 0; 892 } 893 894 static abi_long host_to_target_data_vfinfo_nlattr(struct nlattr *nlattr, 895 void *context) 896 { 897 struct ifla_vf_mac *mac; 898 struct ifla_vf_vlan *vlan; 899 struct ifla_vf_vlan_info *vlan_info; 900 struct ifla_vf_spoofchk *spoofchk; 901 struct ifla_vf_rate *rate; 902 struct ifla_vf_link_state *link_state; 903 struct ifla_vf_rss_query_en *rss_query_en; 904 struct ifla_vf_trust *trust; 905 struct ifla_vf_guid *guid; 906 907 switch (nlattr->nla_type) { 908 /* struct ifla_vf_mac */ 909 case QEMU_IFLA_VF_MAC: 910 mac = NLA_DATA(nlattr); 911 mac->vf = tswap32(mac->vf); 912 break; 913 /* struct ifla_vf_broadcast */ 914 case QEMU_IFLA_VF_BROADCAST: 915 break; 916 /* struct struct ifla_vf_vlan */ 917 case QEMU_IFLA_VF_VLAN: 918 vlan = NLA_DATA(nlattr); 919 vlan->vf = tswap32(vlan->vf); 920 vlan->vlan = tswap32(vlan->vlan); 921 vlan->qos = tswap32(vlan->qos); 922 break; 923 /* struct ifla_vf_vlan_info */ 924 case QEMU_IFLA_VF_TX_RATE: 925 vlan_info = NLA_DATA(nlattr); 926 vlan_info->vf = tswap32(vlan_info->vf); 927 vlan_info->vlan = tswap32(vlan_info->vlan); 928 vlan_info->qos = tswap32(vlan_info->qos); 929 break; 930 /* struct ifla_vf_spoofchk */ 931 case QEMU_IFLA_VF_SPOOFCHK: 932 spoofchk = NLA_DATA(nlattr); 933 spoofchk->vf = tswap32(spoofchk->vf); 934 spoofchk->setting = tswap32(spoofchk->setting); 935 break; 936 /* struct ifla_vf_rate */ 937 case QEMU_IFLA_VF_RATE: 938 rate = NLA_DATA(nlattr); 939 rate->vf = tswap32(rate->vf); 940 rate->min_tx_rate = tswap32(rate->min_tx_rate); 941 rate->max_tx_rate = tswap32(rate->max_tx_rate); 942 break; 943 /* struct ifla_vf_link_state */ 944 case QEMU_IFLA_VF_LINK_STATE: 945 link_state = NLA_DATA(nlattr); 946 link_state->vf = tswap32(link_state->vf); 947 link_state->link_state = tswap32(link_state->link_state); 948 break; 949 /* struct ifla_vf_rss_query_en */ 950 case QEMU_IFLA_VF_RSS_QUERY_EN: 951 rss_query_en = NLA_DATA(nlattr); 952 rss_query_en->vf = tswap32(rss_query_en->vf); 953 rss_query_en->setting = tswap32(rss_query_en->setting); 954 break; 955 /* struct ifla_vf_trust */ 956 case QEMU_IFLA_VF_TRUST: 957 trust = NLA_DATA(nlattr); 958 trust->vf = tswap32(trust->vf); 959 trust->setting = tswap32(trust->setting); 960 break; 961 /* struct ifla_vf_guid */ 962 case QEMU_IFLA_VF_IB_NODE_GUID: 963 case QEMU_IFLA_VF_IB_PORT_GUID: 964 guid = NLA_DATA(nlattr); 965 guid->vf = tswap32(guid->vf); 966 guid->guid = tswap32(guid->guid); 967 break; 968 /* nested */ 969 case QEMU_IFLA_VF_VLAN_LIST: 970 return host_to_target_for_each_nlattr(RTA_DATA(nlattr), nlattr->nla_len, 971 NULL, 972 host_to_target_data_vlan_list_nlattr); 973 case QEMU_IFLA_VF_STATS: 974 return host_to_target_for_each_nlattr(RTA_DATA(nlattr), nlattr->nla_len, 975 NULL, 976 host_to_target_data_vf_stats_nlattr); 977 default: 978 qemu_log_mask(LOG_UNIMP, "Unknown host VFINFO type: %d\n", 979 nlattr->nla_type); 980 break; 981 } 982 return 0; 983 } 984 985 static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr) 986 { 987 uint32_t *u32; 988 struct rtnl_link_stats *st; 989 struct rtnl_link_stats64 *st64; 990 struct rtnl_link_ifmap *map; 991 struct linkinfo_context li_context; 992 993 switch (rtattr->rta_type) { 994 /* binary stream */ 995 case QEMU_IFLA_ADDRESS: 996 case QEMU_IFLA_BROADCAST: 997 case QEMU_IFLA_PERM_ADDRESS: 998 case QEMU_IFLA_PHYS_PORT_ID: 999 /* string */ 1000 case QEMU_IFLA_IFNAME: 1001 case QEMU_IFLA_QDISC: 1002 case QEMU_IFLA_PARENT_DEV_NAME: 1003 case QEMU_IFLA_PARENT_DEV_BUS_NAME: 1004 break; 1005 /* uin8_t */ 1006 case QEMU_IFLA_OPERSTATE: 1007 case QEMU_IFLA_LINKMODE: 1008 case QEMU_IFLA_CARRIER: 1009 case QEMU_IFLA_PROTO_DOWN: 1010 break; 1011 /* uint32_t */ 1012 case QEMU_IFLA_MTU: 1013 case QEMU_IFLA_LINK: 1014 case QEMU_IFLA_WEIGHT: 1015 case QEMU_IFLA_TXQLEN: 1016 case QEMU_IFLA_CARRIER_CHANGES: 1017 case QEMU_IFLA_NUM_RX_QUEUES: 1018 case QEMU_IFLA_NUM_TX_QUEUES: 1019 case QEMU_IFLA_PROMISCUITY: 1020 case QEMU_IFLA_EXT_MASK: 1021 case QEMU_IFLA_LINK_NETNSID: 1022 case QEMU_IFLA_GROUP: 1023 case QEMU_IFLA_MASTER: 1024 case QEMU_IFLA_NUM_VF: 1025 case QEMU_IFLA_GSO_MAX_SEGS: 1026 case QEMU_IFLA_GSO_MAX_SIZE: 1027 case QEMU_IFLA_CARRIER_UP_COUNT: 1028 case QEMU_IFLA_CARRIER_DOWN_COUNT: 1029 case QEMU_IFLA_MIN_MTU: 1030 case QEMU_IFLA_MAX_MTU: 1031 u32 = RTA_DATA(rtattr); 1032 *u32 = tswap32(*u32); 1033 break; 1034 /* struct rtnl_link_stats */ 1035 case QEMU_IFLA_STATS: 1036 st = RTA_DATA(rtattr); 1037 st->rx_packets = tswap32(st->rx_packets); 1038 st->tx_packets = tswap32(st->tx_packets); 1039 st->rx_bytes = tswap32(st->rx_bytes); 1040 st->tx_bytes = tswap32(st->tx_bytes); 1041 st->rx_errors = tswap32(st->rx_errors); 1042 st->tx_errors = tswap32(st->tx_errors); 1043 st->rx_dropped = tswap32(st->rx_dropped); 1044 st->tx_dropped = tswap32(st->tx_dropped); 1045 st->multicast = tswap32(st->multicast); 1046 st->collisions = tswap32(st->collisions); 1047 1048 /* detailed rx_errors: */ 1049 st->rx_length_errors = tswap32(st->rx_length_errors); 1050 st->rx_over_errors = tswap32(st->rx_over_errors); 1051 st->rx_crc_errors = tswap32(st->rx_crc_errors); 1052 st->rx_frame_errors = tswap32(st->rx_frame_errors); 1053 st->rx_fifo_errors = tswap32(st->rx_fifo_errors); 1054 st->rx_missed_errors = tswap32(st->rx_missed_errors); 1055 1056 /* detailed tx_errors */ 1057 st->tx_aborted_errors = tswap32(st->tx_aborted_errors); 1058 st->tx_carrier_errors = tswap32(st->tx_carrier_errors); 1059 st->tx_fifo_errors = tswap32(st->tx_fifo_errors); 1060 st->tx_heartbeat_errors = tswap32(st->tx_heartbeat_errors); 1061 st->tx_window_errors = tswap32(st->tx_window_errors); 1062 1063 /* for cslip etc */ 1064 st->rx_compressed = tswap32(st->rx_compressed); 1065 st->tx_compressed = tswap32(st->tx_compressed); 1066 break; 1067 /* struct rtnl_link_stats64 */ 1068 case QEMU_IFLA_STATS64: 1069 st64 = RTA_DATA(rtattr); 1070 st64->rx_packets = tswap64(st64->rx_packets); 1071 st64->tx_packets = tswap64(st64->tx_packets); 1072 st64->rx_bytes = tswap64(st64->rx_bytes); 1073 st64->tx_bytes = tswap64(st64->tx_bytes); 1074 st64->rx_errors = tswap64(st64->rx_errors); 1075 st64->tx_errors = tswap64(st64->tx_errors); 1076 st64->rx_dropped = tswap64(st64->rx_dropped); 1077 st64->tx_dropped = tswap64(st64->tx_dropped); 1078 st64->multicast = tswap64(st64->multicast); 1079 st64->collisions = tswap64(st64->collisions); 1080 1081 /* detailed rx_errors: */ 1082 st64->rx_length_errors = tswap64(st64->rx_length_errors); 1083 st64->rx_over_errors = tswap64(st64->rx_over_errors); 1084 st64->rx_crc_errors = tswap64(st64->rx_crc_errors); 1085 st64->rx_frame_errors = tswap64(st64->rx_frame_errors); 1086 st64->rx_fifo_errors = tswap64(st64->rx_fifo_errors); 1087 st64->rx_missed_errors = tswap64(st64->rx_missed_errors); 1088 1089 /* detailed tx_errors */ 1090 st64->tx_aborted_errors = tswap64(st64->tx_aborted_errors); 1091 st64->tx_carrier_errors = tswap64(st64->tx_carrier_errors); 1092 st64->tx_fifo_errors = tswap64(st64->tx_fifo_errors); 1093 st64->tx_heartbeat_errors = tswap64(st64->tx_heartbeat_errors); 1094 st64->tx_window_errors = tswap64(st64->tx_window_errors); 1095 1096 /* for cslip etc */ 1097 st64->rx_compressed = tswap64(st64->rx_compressed); 1098 st64->tx_compressed = tswap64(st64->tx_compressed); 1099 break; 1100 /* struct rtnl_link_ifmap */ 1101 case QEMU_IFLA_MAP: 1102 map = RTA_DATA(rtattr); 1103 map->mem_start = tswap64(map->mem_start); 1104 map->mem_end = tswap64(map->mem_end); 1105 map->base_addr = tswap64(map->base_addr); 1106 map->irq = tswap16(map->irq); 1107 break; 1108 /* nested */ 1109 case QEMU_IFLA_LINKINFO: 1110 memset(&li_context, 0, sizeof(li_context)); 1111 return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len, 1112 &li_context, 1113 host_to_target_data_linkinfo_nlattr); 1114 case QEMU_IFLA_AF_SPEC: 1115 return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len, 1116 NULL, 1117 host_to_target_data_spec_nlattr); 1118 case QEMU_IFLA_XDP: 1119 return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len, 1120 NULL, 1121 host_to_target_data_xdp_nlattr); 1122 case QEMU_IFLA_VFINFO_LIST: 1123 return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len, 1124 NULL, 1125 host_to_target_data_vfinfo_nlattr); 1126 default: 1127 qemu_log_mask(LOG_UNIMP, "Unknown host QEMU_IFLA type: %d\n", 1128 rtattr->rta_type); 1129 break; 1130 } 1131 return 0; 1132 } 1133 1134 static abi_long host_to_target_data_addr_rtattr(struct rtattr *rtattr) 1135 { 1136 uint32_t *u32; 1137 struct ifa_cacheinfo *ci; 1138 1139 switch (rtattr->rta_type) { 1140 /* binary: depends on family type */ 1141 case IFA_ADDRESS: 1142 case IFA_LOCAL: 1143 break; 1144 /* string */ 1145 case IFA_LABEL: 1146 break; 1147 /* u32 */ 1148 case IFA_FLAGS: 1149 case IFA_BROADCAST: 1150 u32 = RTA_DATA(rtattr); 1151 *u32 = tswap32(*u32); 1152 break; 1153 /* struct ifa_cacheinfo */ 1154 case IFA_CACHEINFO: 1155 ci = RTA_DATA(rtattr); 1156 ci->ifa_prefered = tswap32(ci->ifa_prefered); 1157 ci->ifa_valid = tswap32(ci->ifa_valid); 1158 ci->cstamp = tswap32(ci->cstamp); 1159 ci->tstamp = tswap32(ci->tstamp); 1160 break; 1161 default: 1162 qemu_log_mask( 1163 LOG_UNIMP, "Unknown host IFA type: %d\n", rtattr->rta_type); 1164 break; 1165 } 1166 return 0; 1167 } 1168 1169 static abi_long host_to_target_data_route_rtattr(struct rtattr *rtattr) 1170 { 1171 uint32_t *u32; 1172 struct rta_cacheinfo *ci; 1173 1174 switch (rtattr->rta_type) { 1175 /* binary: depends on family type */ 1176 case QEMU_RTA_GATEWAY: 1177 case QEMU_RTA_DST: 1178 case QEMU_RTA_PREFSRC: 1179 break; 1180 /* u8 */ 1181 case QEMU_RTA_PREF: 1182 break; 1183 /* u32 */ 1184 case QEMU_RTA_PRIORITY: 1185 case QEMU_RTA_TABLE: 1186 case QEMU_RTA_OIF: 1187 u32 = RTA_DATA(rtattr); 1188 *u32 = tswap32(*u32); 1189 break; 1190 /* struct rta_cacheinfo */ 1191 case QEMU_RTA_CACHEINFO: 1192 ci = RTA_DATA(rtattr); 1193 ci->rta_clntref = tswap32(ci->rta_clntref); 1194 ci->rta_lastuse = tswap32(ci->rta_lastuse); 1195 ci->rta_expires = tswap32(ci->rta_expires); 1196 ci->rta_error = tswap32(ci->rta_error); 1197 ci->rta_used = tswap32(ci->rta_used); 1198 #if defined(RTNETLINK_HAVE_PEERINFO) 1199 ci->rta_id = tswap32(ci->rta_id); 1200 ci->rta_ts = tswap32(ci->rta_ts); 1201 ci->rta_tsage = tswap32(ci->rta_tsage); 1202 #endif 1203 break; 1204 default: 1205 qemu_log_mask( 1206 LOG_UNIMP, "Unknown host RTA type: %d\n", rtattr->rta_type); 1207 break; 1208 } 1209 return 0; 1210 } 1211 1212 static abi_long host_to_target_link_rtattr(struct rtattr *rtattr, 1213 uint32_t rtattr_len) 1214 { 1215 return host_to_target_for_each_rtattr(rtattr, rtattr_len, 1216 host_to_target_data_link_rtattr); 1217 } 1218 1219 static abi_long host_to_target_addr_rtattr(struct rtattr *rtattr, 1220 uint32_t rtattr_len) 1221 { 1222 return host_to_target_for_each_rtattr(rtattr, rtattr_len, 1223 host_to_target_data_addr_rtattr); 1224 } 1225 1226 static abi_long host_to_target_route_rtattr(struct rtattr *rtattr, 1227 uint32_t rtattr_len) 1228 { 1229 return host_to_target_for_each_rtattr(rtattr, rtattr_len, 1230 host_to_target_data_route_rtattr); 1231 } 1232 1233 static abi_long host_to_target_data_route(struct nlmsghdr *nlh) 1234 { 1235 uint32_t nlmsg_len; 1236 struct ifinfomsg *ifi; 1237 struct ifaddrmsg *ifa; 1238 struct rtmsg *rtm; 1239 1240 nlmsg_len = nlh->nlmsg_len; 1241 switch (nlh->nlmsg_type) { 1242 case RTM_NEWLINK: 1243 case RTM_DELLINK: 1244 case RTM_GETLINK: 1245 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ifi))) { 1246 ifi = NLMSG_DATA(nlh); 1247 ifi->ifi_type = tswap16(ifi->ifi_type); 1248 ifi->ifi_index = tswap32(ifi->ifi_index); 1249 ifi->ifi_flags = tswap32(ifi->ifi_flags); 1250 ifi->ifi_change = tswap32(ifi->ifi_change); 1251 host_to_target_link_rtattr(IFLA_RTA(ifi), 1252 nlmsg_len - NLMSG_LENGTH(sizeof(*ifi))); 1253 } 1254 break; 1255 case RTM_NEWADDR: 1256 case RTM_DELADDR: 1257 case RTM_GETADDR: 1258 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ifa))) { 1259 ifa = NLMSG_DATA(nlh); 1260 ifa->ifa_index = tswap32(ifa->ifa_index); 1261 host_to_target_addr_rtattr(IFA_RTA(ifa), 1262 nlmsg_len - NLMSG_LENGTH(sizeof(*ifa))); 1263 } 1264 break; 1265 case RTM_NEWROUTE: 1266 case RTM_DELROUTE: 1267 case RTM_GETROUTE: 1268 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*rtm))) { 1269 rtm = NLMSG_DATA(nlh); 1270 rtm->rtm_flags = tswap32(rtm->rtm_flags); 1271 host_to_target_route_rtattr(RTM_RTA(rtm), 1272 nlmsg_len - NLMSG_LENGTH(sizeof(*rtm))); 1273 } 1274 break; 1275 default: 1276 return -TARGET_EINVAL; 1277 } 1278 return 0; 1279 } 1280 1281 static inline abi_long host_to_target_nlmsg_route(struct nlmsghdr *nlh, 1282 size_t len) 1283 { 1284 return host_to_target_for_each_nlmsg(nlh, len, host_to_target_data_route); 1285 } 1286 1287 static abi_long target_to_host_for_each_nlattr(struct nlattr *nlattr, 1288 size_t len, 1289 abi_long (*target_to_host_nlattr) 1290 (struct nlattr *)) 1291 { 1292 unsigned short aligned_nla_len; 1293 abi_long ret; 1294 1295 while (len > sizeof(struct nlattr)) { 1296 if (tswap16(nlattr->nla_len) < sizeof(struct rtattr) || 1297 tswap16(nlattr->nla_len) > len) { 1298 break; 1299 } 1300 nlattr->nla_len = tswap16(nlattr->nla_len); 1301 nlattr->nla_type = tswap16(nlattr->nla_type); 1302 ret = target_to_host_nlattr(nlattr); 1303 if (ret < 0) { 1304 return ret; 1305 } 1306 1307 aligned_nla_len = NLA_ALIGN(nlattr->nla_len); 1308 if (aligned_nla_len >= len) { 1309 break; 1310 } 1311 len -= aligned_nla_len; 1312 nlattr = (struct nlattr *)(((char *)nlattr) + aligned_nla_len); 1313 } 1314 return 0; 1315 } 1316 1317 static abi_long target_to_host_data_inet6_nlattr(struct nlattr *nlattr) 1318 { 1319 switch (nlattr->nla_type) { 1320 /* uint8_t */ 1321 case QEMU_IFLA_INET6_ADDR_GEN_MODE: 1322 break; 1323 default: 1324 qemu_log_mask(LOG_UNIMP, "Unknown target AF_INET6 type: %d\n", 1325 nlattr->nla_type); 1326 } 1327 return 0; 1328 } 1329 1330 static abi_long target_to_host_for_each_rtattr(struct rtattr *rtattr, 1331 size_t len, 1332 abi_long (*target_to_host_rtattr) 1333 (struct rtattr *)) 1334 { 1335 unsigned short aligned_rta_len; 1336 abi_long ret; 1337 1338 while (len >= sizeof(struct rtattr)) { 1339 if (tswap16(rtattr->rta_len) < sizeof(struct rtattr) || 1340 tswap16(rtattr->rta_len) > len) { 1341 break; 1342 } 1343 rtattr->rta_len = tswap16(rtattr->rta_len); 1344 rtattr->rta_type = tswap16(rtattr->rta_type); 1345 ret = target_to_host_rtattr(rtattr); 1346 if (ret < 0) { 1347 return ret; 1348 } 1349 1350 aligned_rta_len = RTA_ALIGN(rtattr->rta_len); 1351 if (aligned_rta_len >= len) { 1352 break; 1353 } 1354 len -= aligned_rta_len; 1355 rtattr = (struct rtattr *)(((char *)rtattr) + aligned_rta_len); 1356 } 1357 return 0; 1358 } 1359 1360 static abi_long target_to_host_data_spec_nlattr(struct nlattr *nlattr) 1361 { 1362 switch (nlattr->nla_type & NLA_TYPE_MASK) { 1363 case AF_INET6: 1364 return target_to_host_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len, 1365 target_to_host_data_inet6_nlattr); 1366 default: 1367 qemu_log_mask(LOG_UNIMP, "Unknown target AF_SPEC type: %d\n", 1368 nlattr->nla_type); 1369 break; 1370 } 1371 return 0; 1372 } 1373 1374 static abi_long target_to_host_data_link_rtattr(struct rtattr *rtattr) 1375 { 1376 uint32_t *u32; 1377 1378 switch (rtattr->rta_type & NLA_TYPE_MASK) { 1379 /* uint32_t */ 1380 case QEMU_IFLA_MTU: 1381 case QEMU_IFLA_TXQLEN: 1382 case QEMU_IFLA_EXT_MASK: 1383 u32 = RTA_DATA(rtattr); 1384 *u32 = tswap32(*u32); 1385 break; 1386 case QEMU_IFLA_AF_SPEC: 1387 return target_to_host_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len, 1388 target_to_host_data_spec_nlattr); 1389 default: 1390 qemu_log_mask(LOG_UNIMP, "Unknown target QEMU_IFLA type: %d\n", 1391 rtattr->rta_type); 1392 break; 1393 } 1394 return 0; 1395 } 1396 1397 static abi_long target_to_host_data_addr_rtattr(struct rtattr *rtattr) 1398 { 1399 switch (rtattr->rta_type) { 1400 /* binary: depends on family type */ 1401 case IFA_LOCAL: 1402 case IFA_ADDRESS: 1403 break; 1404 default: 1405 qemu_log_mask(LOG_UNIMP, "Unknown target IFA type: %d\n", 1406 rtattr->rta_type); 1407 break; 1408 } 1409 return 0; 1410 } 1411 1412 static abi_long target_to_host_data_route_rtattr(struct rtattr *rtattr) 1413 { 1414 uint32_t *u32; 1415 switch (rtattr->rta_type) { 1416 /* binary: depends on family type */ 1417 case QEMU_RTA_DST: 1418 case QEMU_RTA_SRC: 1419 case QEMU_RTA_GATEWAY: 1420 break; 1421 /* u32 */ 1422 case QEMU_RTA_PRIORITY: 1423 case QEMU_RTA_TABLE: 1424 case QEMU_RTA_OIF: 1425 u32 = RTA_DATA(rtattr); 1426 *u32 = tswap32(*u32); 1427 break; 1428 default: 1429 qemu_log_mask(LOG_UNIMP, "Unknown target RTA type: %d\n", 1430 rtattr->rta_type); 1431 break; 1432 } 1433 return 0; 1434 } 1435 1436 static void target_to_host_link_rtattr(struct rtattr *rtattr, 1437 uint32_t rtattr_len) 1438 { 1439 target_to_host_for_each_rtattr(rtattr, rtattr_len, 1440 target_to_host_data_link_rtattr); 1441 } 1442 1443 static void target_to_host_addr_rtattr(struct rtattr *rtattr, 1444 uint32_t rtattr_len) 1445 { 1446 target_to_host_for_each_rtattr(rtattr, rtattr_len, 1447 target_to_host_data_addr_rtattr); 1448 } 1449 1450 static void target_to_host_route_rtattr(struct rtattr *rtattr, 1451 uint32_t rtattr_len) 1452 { 1453 target_to_host_for_each_rtattr(rtattr, rtattr_len, 1454 target_to_host_data_route_rtattr); 1455 } 1456 1457 static abi_long target_to_host_data_route(struct nlmsghdr *nlh) 1458 { 1459 struct ifinfomsg *ifi; 1460 struct ifaddrmsg *ifa; 1461 struct rtmsg *rtm; 1462 1463 switch (nlh->nlmsg_type) { 1464 case RTM_NEWLINK: 1465 case RTM_DELLINK: 1466 case RTM_SETLINK: 1467 case RTM_GETLINK: 1468 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ifi))) { 1469 ifi = NLMSG_DATA(nlh); 1470 ifi->ifi_type = tswap16(ifi->ifi_type); 1471 ifi->ifi_index = tswap32(ifi->ifi_index); 1472 ifi->ifi_flags = tswap32(ifi->ifi_flags); 1473 ifi->ifi_change = tswap32(ifi->ifi_change); 1474 target_to_host_link_rtattr(IFLA_RTA(ifi), nlh->nlmsg_len - 1475 NLMSG_LENGTH(sizeof(*ifi))); 1476 } 1477 break; 1478 case RTM_GETADDR: 1479 case RTM_NEWADDR: 1480 case RTM_DELADDR: 1481 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ifa))) { 1482 ifa = NLMSG_DATA(nlh); 1483 ifa->ifa_index = tswap32(ifa->ifa_index); 1484 target_to_host_addr_rtattr(IFA_RTA(ifa), nlh->nlmsg_len - 1485 NLMSG_LENGTH(sizeof(*ifa))); 1486 } 1487 break; 1488 case RTM_NEWROUTE: 1489 case RTM_DELROUTE: 1490 case RTM_GETROUTE: 1491 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*rtm))) { 1492 rtm = NLMSG_DATA(nlh); 1493 rtm->rtm_flags = tswap32(rtm->rtm_flags); 1494 target_to_host_route_rtattr(RTM_RTA(rtm), nlh->nlmsg_len - 1495 NLMSG_LENGTH(sizeof(*rtm))); 1496 } 1497 break; 1498 default: 1499 return -TARGET_EOPNOTSUPP; 1500 } 1501 return 0; 1502 } 1503 1504 static abi_long target_to_host_nlmsg_route(struct nlmsghdr *nlh, size_t len) 1505 { 1506 return target_to_host_for_each_nlmsg(nlh, len, target_to_host_data_route); 1507 } 1508 #endif /* CONFIG_RTNETLINK */ 1509 1510 static abi_long host_to_target_data_audit(struct nlmsghdr *nlh) 1511 { 1512 switch (nlh->nlmsg_type) { 1513 default: 1514 qemu_log_mask(LOG_UNIMP, "Unknown host audit message type %d\n", 1515 nlh->nlmsg_type); 1516 return -TARGET_EINVAL; 1517 } 1518 return 0; 1519 } 1520 1521 static inline abi_long host_to_target_nlmsg_audit(struct nlmsghdr *nlh, 1522 size_t len) 1523 { 1524 return host_to_target_for_each_nlmsg(nlh, len, host_to_target_data_audit); 1525 } 1526 1527 static abi_long target_to_host_data_audit(struct nlmsghdr *nlh) 1528 { 1529 switch (nlh->nlmsg_type) { 1530 case AUDIT_USER: 1531 case AUDIT_FIRST_USER_MSG ... AUDIT_LAST_USER_MSG: 1532 case AUDIT_FIRST_USER_MSG2 ... AUDIT_LAST_USER_MSG2: 1533 break; 1534 default: 1535 qemu_log_mask(LOG_UNIMP, "Unknown target audit message type %d\n", 1536 nlh->nlmsg_type); 1537 return -TARGET_EINVAL; 1538 } 1539 1540 return 0; 1541 } 1542 1543 static abi_long target_to_host_nlmsg_audit(struct nlmsghdr *nlh, size_t len) 1544 { 1545 return target_to_host_for_each_nlmsg(nlh, len, target_to_host_data_audit); 1546 } 1547 1548 static abi_long packet_target_to_host_sockaddr(void *host_addr, 1549 abi_ulong target_addr, 1550 socklen_t len) 1551 { 1552 struct sockaddr *addr = host_addr; 1553 struct target_sockaddr *target_saddr; 1554 1555 target_saddr = lock_user(VERIFY_READ, target_addr, len, 1); 1556 if (!target_saddr) { 1557 return -TARGET_EFAULT; 1558 } 1559 1560 memcpy(addr, target_saddr, len); 1561 addr->sa_family = tswap16(target_saddr->sa_family); 1562 /* spkt_protocol is big-endian */ 1563 1564 unlock_user(target_saddr, target_addr, 0); 1565 return 0; 1566 } 1567 1568 TargetFdTrans target_packet_trans = { 1569 .target_to_host_addr = packet_target_to_host_sockaddr, 1570 }; 1571 1572 #ifdef CONFIG_RTNETLINK 1573 static abi_long netlink_route_target_to_host(void *buf, size_t len) 1574 { 1575 abi_long ret; 1576 1577 ret = target_to_host_nlmsg_route(buf, len); 1578 if (ret < 0) { 1579 return ret; 1580 } 1581 1582 return len; 1583 } 1584 1585 static abi_long netlink_route_host_to_target(void *buf, size_t len) 1586 { 1587 abi_long ret; 1588 1589 ret = host_to_target_nlmsg_route(buf, len); 1590 if (ret < 0) { 1591 return ret; 1592 } 1593 1594 return len; 1595 } 1596 1597 TargetFdTrans target_netlink_route_trans = { 1598 .target_to_host_data = netlink_route_target_to_host, 1599 .host_to_target_data = netlink_route_host_to_target, 1600 }; 1601 #endif /* CONFIG_RTNETLINK */ 1602 1603 static abi_long netlink_audit_target_to_host(void *buf, size_t len) 1604 { 1605 abi_long ret; 1606 1607 ret = target_to_host_nlmsg_audit(buf, len); 1608 if (ret < 0) { 1609 return ret; 1610 } 1611 1612 return len; 1613 } 1614 1615 static abi_long netlink_audit_host_to_target(void *buf, size_t len) 1616 { 1617 abi_long ret; 1618 1619 ret = host_to_target_nlmsg_audit(buf, len); 1620 if (ret < 0) { 1621 return ret; 1622 } 1623 1624 return len; 1625 } 1626 1627 TargetFdTrans target_netlink_audit_trans = { 1628 .target_to_host_data = netlink_audit_target_to_host, 1629 .host_to_target_data = netlink_audit_host_to_target, 1630 }; 1631 1632 /* signalfd siginfo conversion */ 1633 1634 static void 1635 host_to_target_signalfd_siginfo(struct signalfd_siginfo *tinfo, 1636 const struct signalfd_siginfo *info) 1637 { 1638 int sig = host_to_target_signal(info->ssi_signo); 1639 1640 /* linux/signalfd.h defines a ssi_addr_lsb 1641 * not defined in sys/signalfd.h but used by some kernels 1642 */ 1643 1644 #ifdef BUS_MCEERR_AO 1645 if (tinfo->ssi_signo == SIGBUS && 1646 (tinfo->ssi_code == BUS_MCEERR_AR || 1647 tinfo->ssi_code == BUS_MCEERR_AO)) { 1648 uint16_t *ssi_addr_lsb = (uint16_t *)(&info->ssi_addr + 1); 1649 uint16_t *tssi_addr_lsb = (uint16_t *)(&tinfo->ssi_addr + 1); 1650 *tssi_addr_lsb = tswap16(*ssi_addr_lsb); 1651 } 1652 #endif 1653 1654 tinfo->ssi_signo = tswap32(sig); 1655 tinfo->ssi_errno = tswap32(tinfo->ssi_errno); 1656 tinfo->ssi_code = tswap32(info->ssi_code); 1657 tinfo->ssi_pid = tswap32(info->ssi_pid); 1658 tinfo->ssi_uid = tswap32(info->ssi_uid); 1659 tinfo->ssi_fd = tswap32(info->ssi_fd); 1660 tinfo->ssi_tid = tswap32(info->ssi_tid); 1661 tinfo->ssi_band = tswap32(info->ssi_band); 1662 tinfo->ssi_overrun = tswap32(info->ssi_overrun); 1663 tinfo->ssi_trapno = tswap32(info->ssi_trapno); 1664 tinfo->ssi_status = tswap32(info->ssi_status); 1665 tinfo->ssi_int = tswap32(info->ssi_int); 1666 tinfo->ssi_ptr = tswap64(info->ssi_ptr); 1667 tinfo->ssi_utime = tswap64(info->ssi_utime); 1668 tinfo->ssi_stime = tswap64(info->ssi_stime); 1669 tinfo->ssi_addr = tswap64(info->ssi_addr); 1670 } 1671 1672 static abi_long host_to_target_data_signalfd(void *buf, size_t len) 1673 { 1674 int i; 1675 1676 for (i = 0; i < len; i += sizeof(struct signalfd_siginfo)) { 1677 host_to_target_signalfd_siginfo(buf + i, buf + i); 1678 } 1679 1680 return len; 1681 } 1682 1683 TargetFdTrans target_signalfd_trans = { 1684 .host_to_target_data = host_to_target_data_signalfd, 1685 }; 1686 1687 static abi_long swap_data_u64(void *buf, size_t len) 1688 { 1689 uint64_t *counter = buf; 1690 int i; 1691 1692 if (len < sizeof(uint64_t)) { 1693 return -EINVAL; 1694 } 1695 1696 for (i = 0; i < len; i += sizeof(uint64_t)) { 1697 *counter = tswap64(*counter); 1698 counter++; 1699 } 1700 1701 return len; 1702 } 1703 1704 TargetFdTrans target_eventfd_trans = { 1705 .host_to_target_data = swap_data_u64, 1706 .target_to_host_data = swap_data_u64, 1707 }; 1708 1709 TargetFdTrans target_timerfd_trans = { 1710 .host_to_target_data = swap_data_u64, 1711 }; 1712 1713 #if defined(CONFIG_INOTIFY) && (defined(TARGET_NR_inotify_init) || \ 1714 defined(TARGET_NR_inotify_init1)) 1715 static abi_long host_to_target_data_inotify(void *buf, size_t len) 1716 { 1717 struct inotify_event *ev; 1718 int i; 1719 uint32_t name_len; 1720 1721 for (i = 0; i < len; i += sizeof(struct inotify_event) + name_len) { 1722 ev = (struct inotify_event *)((char *)buf + i); 1723 name_len = ev->len; 1724 1725 ev->wd = tswap32(ev->wd); 1726 ev->mask = tswap32(ev->mask); 1727 ev->cookie = tswap32(ev->cookie); 1728 ev->len = tswap32(name_len); 1729 } 1730 1731 return len; 1732 } 1733 1734 TargetFdTrans target_inotify_trans = { 1735 .host_to_target_data = host_to_target_data_inotify, 1736 }; 1737 #endif 1738