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_MAX 142 }; 143 144 enum { 145 QEMU_IFLA_BRPORT_UNSPEC, 146 QEMU_IFLA_BRPORT_STATE, 147 QEMU_IFLA_BRPORT_PRIORITY, 148 QEMU_IFLA_BRPORT_COST, 149 QEMU_IFLA_BRPORT_MODE, 150 QEMU_IFLA_BRPORT_GUARD, 151 QEMU_IFLA_BRPORT_PROTECT, 152 QEMU_IFLA_BRPORT_FAST_LEAVE, 153 QEMU_IFLA_BRPORT_LEARNING, 154 QEMU_IFLA_BRPORT_UNICAST_FLOOD, 155 QEMU_IFLA_BRPORT_PROXYARP, 156 QEMU_IFLA_BRPORT_LEARNING_SYNC, 157 QEMU_IFLA_BRPORT_PROXYARP_WIFI, 158 QEMU_IFLA_BRPORT_ROOT_ID, 159 QEMU_IFLA_BRPORT_BRIDGE_ID, 160 QEMU_IFLA_BRPORT_DESIGNATED_PORT, 161 QEMU_IFLA_BRPORT_DESIGNATED_COST, 162 QEMU_IFLA_BRPORT_ID, 163 QEMU_IFLA_BRPORT_NO, 164 QEMU_IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, 165 QEMU_IFLA_BRPORT_CONFIG_PENDING, 166 QEMU_IFLA_BRPORT_MESSAGE_AGE_TIMER, 167 QEMU_IFLA_BRPORT_FORWARD_DELAY_TIMER, 168 QEMU_IFLA_BRPORT_HOLD_TIMER, 169 QEMU_IFLA_BRPORT_FLUSH, 170 QEMU_IFLA_BRPORT_MULTICAST_ROUTER, 171 QEMU_IFLA_BRPORT_PAD, 172 QEMU_IFLA_BRPORT_MCAST_FLOOD, 173 QEMU_IFLA_BRPORT_MCAST_TO_UCAST, 174 QEMU_IFLA_BRPORT_VLAN_TUNNEL, 175 QEMU_IFLA_BRPORT_BCAST_FLOOD, 176 QEMU_IFLA_BRPORT_GROUP_FWD_MASK, 177 QEMU_IFLA_BRPORT_NEIGH_SUPPRESS, 178 QEMU_IFLA_BRPORT_ISOLATED, 179 QEMU_IFLA_BRPORT_BACKUP_PORT, 180 QEMU_IFLA_BRPORT_MRP_RING_OPEN, 181 QEMU_IFLA_BRPORT_MRP_IN_OPEN, 182 QEMU___IFLA_BRPORT_MAX 183 }; 184 185 enum { 186 QEMU_IFLA_TUN_UNSPEC, 187 QEMU_IFLA_TUN_OWNER, 188 QEMU_IFLA_TUN_GROUP, 189 QEMU_IFLA_TUN_TYPE, 190 QEMU_IFLA_TUN_PI, 191 QEMU_IFLA_TUN_VNET_HDR, 192 QEMU_IFLA_TUN_PERSIST, 193 QEMU_IFLA_TUN_MULTI_QUEUE, 194 QEMU_IFLA_TUN_NUM_QUEUES, 195 QEMU_IFLA_TUN_NUM_DISABLED_QUEUES, 196 QEMU___IFLA_TUN_MAX, 197 }; 198 199 enum { 200 QEMU_IFLA_INFO_UNSPEC, 201 QEMU_IFLA_INFO_KIND, 202 QEMU_IFLA_INFO_DATA, 203 QEMU_IFLA_INFO_XSTATS, 204 QEMU_IFLA_INFO_SLAVE_KIND, 205 QEMU_IFLA_INFO_SLAVE_DATA, 206 QEMU___IFLA_INFO_MAX, 207 }; 208 209 enum { 210 QEMU_IFLA_INET_UNSPEC, 211 QEMU_IFLA_INET_CONF, 212 QEMU___IFLA_INET_MAX, 213 }; 214 215 enum { 216 QEMU_IFLA_INET6_UNSPEC, 217 QEMU_IFLA_INET6_FLAGS, 218 QEMU_IFLA_INET6_CONF, 219 QEMU_IFLA_INET6_STATS, 220 QEMU_IFLA_INET6_MCAST, 221 QEMU_IFLA_INET6_CACHEINFO, 222 QEMU_IFLA_INET6_ICMP6STATS, 223 QEMU_IFLA_INET6_TOKEN, 224 QEMU_IFLA_INET6_ADDR_GEN_MODE, 225 QEMU___IFLA_INET6_MAX 226 }; 227 228 enum { 229 QEMU_IFLA_XDP_UNSPEC, 230 QEMU_IFLA_XDP_FD, 231 QEMU_IFLA_XDP_ATTACHED, 232 QEMU_IFLA_XDP_FLAGS, 233 QEMU_IFLA_XDP_PROG_ID, 234 QEMU___IFLA_XDP_MAX, 235 }; 236 237 enum { 238 QEMU_RTA_UNSPEC, 239 QEMU_RTA_DST, 240 QEMU_RTA_SRC, 241 QEMU_RTA_IIF, 242 QEMU_RTA_OIF, 243 QEMU_RTA_GATEWAY, 244 QEMU_RTA_PRIORITY, 245 QEMU_RTA_PREFSRC, 246 QEMU_RTA_METRICS, 247 QEMU_RTA_MULTIPATH, 248 QEMU_RTA_PROTOINFO, /* no longer used */ 249 QEMU_RTA_FLOW, 250 QEMU_RTA_CACHEINFO, 251 QEMU_RTA_SESSION, /* no longer used */ 252 QEMU_RTA_MP_ALGO, /* no longer used */ 253 QEMU_RTA_TABLE, 254 QEMU_RTA_MARK, 255 QEMU_RTA_MFC_STATS, 256 QEMU_RTA_VIA, 257 QEMU_RTA_NEWDST, 258 QEMU_RTA_PREF, 259 QEMU_RTA_ENCAP_TYPE, 260 QEMU_RTA_ENCAP, 261 QEMU_RTA_EXPIRES, 262 QEMU_RTA_PAD, 263 QEMU_RTA_UID, 264 QEMU_RTA_TTL_PROPAGATE, 265 QEMU_RTA_IP_PROTO, 266 QEMU_RTA_SPORT, 267 QEMU_RTA_DPORT, 268 QEMU___RTA_MAX 269 }; 270 271 TargetFdTrans **target_fd_trans; 272 QemuMutex target_fd_trans_lock; 273 unsigned int target_fd_max; 274 275 static void tswap_nlmsghdr(struct nlmsghdr *nlh) 276 { 277 nlh->nlmsg_len = tswap32(nlh->nlmsg_len); 278 nlh->nlmsg_type = tswap16(nlh->nlmsg_type); 279 nlh->nlmsg_flags = tswap16(nlh->nlmsg_flags); 280 nlh->nlmsg_seq = tswap32(nlh->nlmsg_seq); 281 nlh->nlmsg_pid = tswap32(nlh->nlmsg_pid); 282 } 283 284 static abi_long host_to_target_for_each_nlmsg(struct nlmsghdr *nlh, 285 size_t len, 286 abi_long (*host_to_target_nlmsg) 287 (struct nlmsghdr *)) 288 { 289 uint32_t nlmsg_len; 290 uint32_t aligned_nlmsg_len; 291 abi_long ret; 292 293 while (len > sizeof(struct nlmsghdr)) { 294 295 nlmsg_len = nlh->nlmsg_len; 296 if (nlmsg_len < sizeof(struct nlmsghdr) || 297 nlmsg_len > len) { 298 break; 299 } 300 301 switch (nlh->nlmsg_type) { 302 case NLMSG_DONE: 303 tswap_nlmsghdr(nlh); 304 return 0; 305 case NLMSG_NOOP: 306 break; 307 case NLMSG_ERROR: 308 { 309 struct nlmsgerr *e = NLMSG_DATA(nlh); 310 e->error = tswap32(e->error); 311 tswap_nlmsghdr(&e->msg); 312 tswap_nlmsghdr(nlh); 313 return 0; 314 } 315 default: 316 ret = host_to_target_nlmsg(nlh); 317 if (ret < 0) { 318 tswap_nlmsghdr(nlh); 319 return ret; 320 } 321 break; 322 } 323 tswap_nlmsghdr(nlh); 324 325 aligned_nlmsg_len = NLMSG_ALIGN(nlmsg_len); 326 if (aligned_nlmsg_len >= len) { 327 break; 328 } 329 len -= aligned_nlmsg_len; 330 nlh = (struct nlmsghdr *)(((char*)nlh) + aligned_nlmsg_len); 331 } 332 return 0; 333 } 334 335 static abi_long target_to_host_for_each_nlmsg(struct nlmsghdr *nlh, 336 size_t len, 337 abi_long (*target_to_host_nlmsg) 338 (struct nlmsghdr *)) 339 { 340 uint32_t aligned_nlmsg_len; 341 int ret; 342 343 while (len > sizeof(struct nlmsghdr)) { 344 if (tswap32(nlh->nlmsg_len) < sizeof(struct nlmsghdr) || 345 tswap32(nlh->nlmsg_len) > len) { 346 break; 347 } 348 tswap_nlmsghdr(nlh); 349 switch (nlh->nlmsg_type) { 350 case NLMSG_DONE: 351 return 0; 352 case NLMSG_NOOP: 353 break; 354 case NLMSG_ERROR: 355 { 356 struct nlmsgerr *e = NLMSG_DATA(nlh); 357 e->error = tswap32(e->error); 358 tswap_nlmsghdr(&e->msg); 359 return 0; 360 } 361 default: 362 ret = target_to_host_nlmsg(nlh); 363 if (ret < 0) { 364 return ret; 365 } 366 } 367 368 aligned_nlmsg_len = NLMSG_ALIGN(nlh->nlmsg_len); 369 if (aligned_nlmsg_len >= len) { 370 break; 371 } 372 len -= aligned_nlmsg_len; 373 nlh = (struct nlmsghdr *)(((char *)nlh) + aligned_nlmsg_len); 374 } 375 return 0; 376 } 377 378 #ifdef CONFIG_RTNETLINK 379 static abi_long host_to_target_for_each_nlattr(struct nlattr *nlattr, 380 size_t len, void *context, 381 abi_long (*host_to_target_nlattr) 382 (struct nlattr *, 383 void *context)) 384 { 385 unsigned short nla_len; 386 unsigned short aligned_nla_len; 387 abi_long ret; 388 389 while (len > sizeof(struct nlattr)) { 390 nla_len = nlattr->nla_len; 391 if (nla_len < sizeof(struct nlattr) || 392 nla_len > len) { 393 break; 394 } 395 ret = host_to_target_nlattr(nlattr, context); 396 nlattr->nla_len = tswap16(nlattr->nla_len); 397 nlattr->nla_type = tswap16(nlattr->nla_type); 398 if (ret < 0) { 399 return ret; 400 } 401 402 aligned_nla_len = NLA_ALIGN(nla_len); 403 if (aligned_nla_len >= len) { 404 break; 405 } 406 len -= aligned_nla_len; 407 nlattr = (struct nlattr *)(((char *)nlattr) + aligned_nla_len); 408 } 409 return 0; 410 } 411 412 static abi_long host_to_target_for_each_rtattr(struct rtattr *rtattr, 413 size_t len, 414 abi_long (*host_to_target_rtattr) 415 (struct rtattr *)) 416 { 417 unsigned short rta_len; 418 unsigned short aligned_rta_len; 419 abi_long ret; 420 421 while (len > sizeof(struct rtattr)) { 422 rta_len = rtattr->rta_len; 423 if (rta_len < sizeof(struct rtattr) || 424 rta_len > len) { 425 break; 426 } 427 ret = host_to_target_rtattr(rtattr); 428 rtattr->rta_len = tswap16(rtattr->rta_len); 429 rtattr->rta_type = tswap16(rtattr->rta_type); 430 if (ret < 0) { 431 return ret; 432 } 433 434 aligned_rta_len = RTA_ALIGN(rta_len); 435 if (aligned_rta_len >= len) { 436 break; 437 } 438 len -= aligned_rta_len; 439 rtattr = (struct rtattr *)(((char *)rtattr) + aligned_rta_len); 440 } 441 return 0; 442 } 443 444 #define NLA_DATA(nla) ((void *)((char *)(nla)) + NLA_HDRLEN) 445 446 static abi_long host_to_target_data_bridge_nlattr(struct nlattr *nlattr, 447 void *context) 448 { 449 uint16_t *u16; 450 uint32_t *u32; 451 uint64_t *u64; 452 453 switch (nlattr->nla_type) { 454 /* no data */ 455 case QEMU_IFLA_BR_FDB_FLUSH: 456 break; 457 /* binary */ 458 case QEMU_IFLA_BR_GROUP_ADDR: 459 break; 460 /* uint8_t */ 461 case QEMU_IFLA_BR_VLAN_FILTERING: 462 case QEMU_IFLA_BR_TOPOLOGY_CHANGE: 463 case QEMU_IFLA_BR_TOPOLOGY_CHANGE_DETECTED: 464 case QEMU_IFLA_BR_MCAST_ROUTER: 465 case QEMU_IFLA_BR_MCAST_SNOOPING: 466 case QEMU_IFLA_BR_MCAST_QUERY_USE_IFADDR: 467 case QEMU_IFLA_BR_MCAST_QUERIER: 468 case QEMU_IFLA_BR_NF_CALL_IPTABLES: 469 case QEMU_IFLA_BR_NF_CALL_IP6TABLES: 470 case QEMU_IFLA_BR_NF_CALL_ARPTABLES: 471 case QEMU_IFLA_BR_VLAN_STATS_ENABLED: 472 case QEMU_IFLA_BR_MCAST_STATS_ENABLED: 473 case QEMU_IFLA_BR_MCAST_IGMP_VERSION: 474 case QEMU_IFLA_BR_MCAST_MLD_VERSION: 475 case QEMU_IFLA_BR_VLAN_STATS_PER_PORT: 476 break; 477 /* uint16_t */ 478 case QEMU_IFLA_BR_PRIORITY: 479 case QEMU_IFLA_BR_VLAN_PROTOCOL: 480 case QEMU_IFLA_BR_GROUP_FWD_MASK: 481 case QEMU_IFLA_BR_ROOT_PORT: 482 case QEMU_IFLA_BR_VLAN_DEFAULT_PVID: 483 u16 = NLA_DATA(nlattr); 484 *u16 = tswap16(*u16); 485 break; 486 /* uint32_t */ 487 case QEMU_IFLA_BR_FORWARD_DELAY: 488 case QEMU_IFLA_BR_HELLO_TIME: 489 case QEMU_IFLA_BR_MAX_AGE: 490 case QEMU_IFLA_BR_AGEING_TIME: 491 case QEMU_IFLA_BR_STP_STATE: 492 case QEMU_IFLA_BR_ROOT_PATH_COST: 493 case QEMU_IFLA_BR_MCAST_HASH_ELASTICITY: 494 case QEMU_IFLA_BR_MCAST_HASH_MAX: 495 case QEMU_IFLA_BR_MCAST_LAST_MEMBER_CNT: 496 case QEMU_IFLA_BR_MCAST_STARTUP_QUERY_CNT: 497 u32 = NLA_DATA(nlattr); 498 *u32 = tswap32(*u32); 499 break; 500 /* uint64_t */ 501 case QEMU_IFLA_BR_HELLO_TIMER: 502 case QEMU_IFLA_BR_TCN_TIMER: 503 case QEMU_IFLA_BR_GC_TIMER: 504 case QEMU_IFLA_BR_TOPOLOGY_CHANGE_TIMER: 505 case QEMU_IFLA_BR_MCAST_LAST_MEMBER_INTVL: 506 case QEMU_IFLA_BR_MCAST_MEMBERSHIP_INTVL: 507 case QEMU_IFLA_BR_MCAST_QUERIER_INTVL: 508 case QEMU_IFLA_BR_MCAST_QUERY_INTVL: 509 case QEMU_IFLA_BR_MCAST_QUERY_RESPONSE_INTVL: 510 case QEMU_IFLA_BR_MCAST_STARTUP_QUERY_INTVL: 511 u64 = NLA_DATA(nlattr); 512 *u64 = tswap64(*u64); 513 break; 514 /* ifla_bridge_id: uin8_t[] */ 515 case QEMU_IFLA_BR_ROOT_ID: 516 case QEMU_IFLA_BR_BRIDGE_ID: 517 break; 518 /* br_boolopt_multi { uint32_t, uint32_t } */ 519 case QEMU_IFLA_BR_MULTI_BOOLOPT: 520 u32 = NLA_DATA(nlattr); 521 u32[0] = tswap32(u32[0]); /* optval */ 522 u32[1] = tswap32(u32[1]); /* optmask */ 523 break; 524 default: 525 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_BR type %d\n", 526 nlattr->nla_type); 527 break; 528 } 529 return 0; 530 } 531 532 static abi_long host_to_target_slave_data_bridge_nlattr(struct nlattr *nlattr, 533 void *context) 534 { 535 uint16_t *u16; 536 uint32_t *u32; 537 uint64_t *u64; 538 539 switch (nlattr->nla_type) { 540 /* uint8_t */ 541 case QEMU_IFLA_BRPORT_STATE: 542 case QEMU_IFLA_BRPORT_MODE: 543 case QEMU_IFLA_BRPORT_GUARD: 544 case QEMU_IFLA_BRPORT_PROTECT: 545 case QEMU_IFLA_BRPORT_FAST_LEAVE: 546 case QEMU_IFLA_BRPORT_LEARNING: 547 case QEMU_IFLA_BRPORT_UNICAST_FLOOD: 548 case QEMU_IFLA_BRPORT_PROXYARP: 549 case QEMU_IFLA_BRPORT_LEARNING_SYNC: 550 case QEMU_IFLA_BRPORT_PROXYARP_WIFI: 551 case QEMU_IFLA_BRPORT_TOPOLOGY_CHANGE_ACK: 552 case QEMU_IFLA_BRPORT_CONFIG_PENDING: 553 case QEMU_IFLA_BRPORT_MULTICAST_ROUTER: 554 case QEMU_IFLA_BRPORT_MCAST_FLOOD: 555 case QEMU_IFLA_BRPORT_MCAST_TO_UCAST: 556 case QEMU_IFLA_BRPORT_VLAN_TUNNEL: 557 case QEMU_IFLA_BRPORT_BCAST_FLOOD: 558 case QEMU_IFLA_BRPORT_NEIGH_SUPPRESS: 559 case QEMU_IFLA_BRPORT_ISOLATED: 560 case QEMU_IFLA_BRPORT_MRP_RING_OPEN: 561 case QEMU_IFLA_BRPORT_MRP_IN_OPEN: 562 break; 563 /* uint16_t */ 564 case QEMU_IFLA_BRPORT_PRIORITY: 565 case QEMU_IFLA_BRPORT_DESIGNATED_PORT: 566 case QEMU_IFLA_BRPORT_DESIGNATED_COST: 567 case QEMU_IFLA_BRPORT_ID: 568 case QEMU_IFLA_BRPORT_NO: 569 case QEMU_IFLA_BRPORT_GROUP_FWD_MASK: 570 u16 = NLA_DATA(nlattr); 571 *u16 = tswap16(*u16); 572 break; 573 /* uin32_t */ 574 case QEMU_IFLA_BRPORT_COST: 575 case QEMU_IFLA_BRPORT_BACKUP_PORT: 576 u32 = NLA_DATA(nlattr); 577 *u32 = tswap32(*u32); 578 break; 579 /* uint64_t */ 580 case QEMU_IFLA_BRPORT_MESSAGE_AGE_TIMER: 581 case QEMU_IFLA_BRPORT_FORWARD_DELAY_TIMER: 582 case QEMU_IFLA_BRPORT_HOLD_TIMER: 583 u64 = NLA_DATA(nlattr); 584 *u64 = tswap64(*u64); 585 break; 586 /* ifla_bridge_id: uint8_t[] */ 587 case QEMU_IFLA_BRPORT_ROOT_ID: 588 case QEMU_IFLA_BRPORT_BRIDGE_ID: 589 break; 590 default: 591 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_BRPORT type %d\n", 592 nlattr->nla_type); 593 break; 594 } 595 return 0; 596 } 597 598 static abi_long host_to_target_data_tun_nlattr(struct nlattr *nlattr, 599 void *context) 600 { 601 uint32_t *u32; 602 603 switch (nlattr->nla_type) { 604 /* uint8_t */ 605 case QEMU_IFLA_TUN_TYPE: 606 case QEMU_IFLA_TUN_PI: 607 case QEMU_IFLA_TUN_VNET_HDR: 608 case QEMU_IFLA_TUN_PERSIST: 609 case QEMU_IFLA_TUN_MULTI_QUEUE: 610 break; 611 /* uint32_t */ 612 case QEMU_IFLA_TUN_NUM_QUEUES: 613 case QEMU_IFLA_TUN_NUM_DISABLED_QUEUES: 614 case QEMU_IFLA_TUN_OWNER: 615 case QEMU_IFLA_TUN_GROUP: 616 u32 = NLA_DATA(nlattr); 617 *u32 = tswap32(*u32); 618 break; 619 default: 620 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_TUN type %d\n", 621 nlattr->nla_type); 622 break; 623 } 624 return 0; 625 } 626 627 struct linkinfo_context { 628 int len; 629 char *name; 630 int slave_len; 631 char *slave_name; 632 }; 633 634 static abi_long host_to_target_data_linkinfo_nlattr(struct nlattr *nlattr, 635 void *context) 636 { 637 struct linkinfo_context *li_context = context; 638 639 switch (nlattr->nla_type) { 640 /* string */ 641 case QEMU_IFLA_INFO_KIND: 642 li_context->name = NLA_DATA(nlattr); 643 li_context->len = nlattr->nla_len - NLA_HDRLEN; 644 break; 645 case QEMU_IFLA_INFO_SLAVE_KIND: 646 li_context->slave_name = NLA_DATA(nlattr); 647 li_context->slave_len = nlattr->nla_len - NLA_HDRLEN; 648 break; 649 /* stats */ 650 case QEMU_IFLA_INFO_XSTATS: 651 /* FIXME: only used by CAN */ 652 break; 653 /* nested */ 654 case QEMU_IFLA_INFO_DATA: 655 if (strncmp(li_context->name, "bridge", 656 li_context->len) == 0) { 657 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), 658 nlattr->nla_len, 659 NULL, 660 host_to_target_data_bridge_nlattr); 661 } else if (strncmp(li_context->name, "tun", 662 li_context->len) == 0) { 663 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), 664 nlattr->nla_len, 665 NULL, 666 host_to_target_data_tun_nlattr); 667 } else { 668 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_INFO_KIND %s\n", 669 li_context->name); 670 } 671 break; 672 case QEMU_IFLA_INFO_SLAVE_DATA: 673 if (strncmp(li_context->slave_name, "bridge", 674 li_context->slave_len) == 0) { 675 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), 676 nlattr->nla_len, 677 NULL, 678 host_to_target_slave_data_bridge_nlattr); 679 } else { 680 qemu_log_mask(LOG_UNIMP, "Unknown QEMU_IFLA_INFO_SLAVE_KIND %s\n", 681 li_context->slave_name); 682 } 683 break; 684 default: 685 qemu_log_mask(LOG_UNIMP, "Unknown host QEMU_IFLA_INFO type: %d\n", 686 nlattr->nla_type); 687 break; 688 } 689 690 return 0; 691 } 692 693 static abi_long host_to_target_data_inet_nlattr(struct nlattr *nlattr, 694 void *context) 695 { 696 uint32_t *u32; 697 int i; 698 699 switch (nlattr->nla_type) { 700 case QEMU_IFLA_INET_CONF: 701 u32 = NLA_DATA(nlattr); 702 for (i = 0; i < (nlattr->nla_len - NLA_HDRLEN) / sizeof(*u32); 703 i++) { 704 u32[i] = tswap32(u32[i]); 705 } 706 break; 707 default: 708 qemu_log_mask(LOG_UNIMP, "Unknown host AF_INET type: %d\n", 709 nlattr->nla_type); 710 } 711 return 0; 712 } 713 714 static abi_long host_to_target_data_inet6_nlattr(struct nlattr *nlattr, 715 void *context) 716 { 717 uint32_t *u32; 718 uint64_t *u64; 719 struct ifla_cacheinfo *ci; 720 int i; 721 722 switch (nlattr->nla_type) { 723 /* binaries */ 724 case QEMU_IFLA_INET6_TOKEN: 725 break; 726 /* uint8_t */ 727 case QEMU_IFLA_INET6_ADDR_GEN_MODE: 728 break; 729 /* uint32_t */ 730 case QEMU_IFLA_INET6_FLAGS: 731 u32 = NLA_DATA(nlattr); 732 *u32 = tswap32(*u32); 733 break; 734 /* uint32_t[] */ 735 case QEMU_IFLA_INET6_CONF: 736 u32 = NLA_DATA(nlattr); 737 for (i = 0; i < (nlattr->nla_len - NLA_HDRLEN) / sizeof(*u32); 738 i++) { 739 u32[i] = tswap32(u32[i]); 740 } 741 break; 742 /* ifla_cacheinfo */ 743 case QEMU_IFLA_INET6_CACHEINFO: 744 ci = NLA_DATA(nlattr); 745 ci->max_reasm_len = tswap32(ci->max_reasm_len); 746 ci->tstamp = tswap32(ci->tstamp); 747 ci->reachable_time = tswap32(ci->reachable_time); 748 ci->retrans_time = tswap32(ci->retrans_time); 749 break; 750 /* uint64_t[] */ 751 case QEMU_IFLA_INET6_STATS: 752 case QEMU_IFLA_INET6_ICMP6STATS: 753 u64 = NLA_DATA(nlattr); 754 for (i = 0; i < (nlattr->nla_len - NLA_HDRLEN) / sizeof(*u64); 755 i++) { 756 u64[i] = tswap64(u64[i]); 757 } 758 break; 759 default: 760 qemu_log_mask(LOG_UNIMP, "Unknown host AF_INET6 type: %d\n", 761 nlattr->nla_type); 762 } 763 return 0; 764 } 765 766 static abi_long host_to_target_data_spec_nlattr(struct nlattr *nlattr, 767 void *context) 768 { 769 switch (nlattr->nla_type) { 770 case AF_INET: 771 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len, 772 NULL, 773 host_to_target_data_inet_nlattr); 774 case AF_INET6: 775 return host_to_target_for_each_nlattr(NLA_DATA(nlattr), nlattr->nla_len, 776 NULL, 777 host_to_target_data_inet6_nlattr); 778 default: 779 qemu_log_mask(LOG_UNIMP, "Unknown host AF_SPEC type: %d\n", 780 nlattr->nla_type); 781 break; 782 } 783 return 0; 784 } 785 786 static abi_long host_to_target_data_xdp_nlattr(struct nlattr *nlattr, 787 void *context) 788 { 789 uint32_t *u32; 790 791 switch (nlattr->nla_type) { 792 /* uint8_t */ 793 case QEMU_IFLA_XDP_ATTACHED: 794 break; 795 /* uint32_t */ 796 case QEMU_IFLA_XDP_PROG_ID: 797 u32 = NLA_DATA(nlattr); 798 *u32 = tswap32(*u32); 799 break; 800 default: 801 qemu_log_mask( 802 LOG_UNIMP, "Unknown host XDP type: %d\n", nlattr->nla_type); 803 break; 804 } 805 return 0; 806 } 807 808 static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr) 809 { 810 uint32_t *u32; 811 struct rtnl_link_stats *st; 812 struct rtnl_link_stats64 *st64; 813 struct rtnl_link_ifmap *map; 814 struct linkinfo_context li_context; 815 816 switch (rtattr->rta_type) { 817 /* binary stream */ 818 case QEMU_IFLA_ADDRESS: 819 case QEMU_IFLA_BROADCAST: 820 case QEMU_IFLA_PERM_ADDRESS: 821 /* string */ 822 case QEMU_IFLA_IFNAME: 823 case QEMU_IFLA_QDISC: 824 break; 825 /* uin8_t */ 826 case QEMU_IFLA_OPERSTATE: 827 case QEMU_IFLA_LINKMODE: 828 case QEMU_IFLA_CARRIER: 829 case QEMU_IFLA_PROTO_DOWN: 830 break; 831 /* uint32_t */ 832 case QEMU_IFLA_MTU: 833 case QEMU_IFLA_LINK: 834 case QEMU_IFLA_WEIGHT: 835 case QEMU_IFLA_TXQLEN: 836 case QEMU_IFLA_CARRIER_CHANGES: 837 case QEMU_IFLA_NUM_RX_QUEUES: 838 case QEMU_IFLA_NUM_TX_QUEUES: 839 case QEMU_IFLA_PROMISCUITY: 840 case QEMU_IFLA_EXT_MASK: 841 case QEMU_IFLA_LINK_NETNSID: 842 case QEMU_IFLA_GROUP: 843 case QEMU_IFLA_MASTER: 844 case QEMU_IFLA_NUM_VF: 845 case QEMU_IFLA_GSO_MAX_SEGS: 846 case QEMU_IFLA_GSO_MAX_SIZE: 847 case QEMU_IFLA_CARRIER_UP_COUNT: 848 case QEMU_IFLA_CARRIER_DOWN_COUNT: 849 case QEMU_IFLA_MIN_MTU: 850 case QEMU_IFLA_MAX_MTU: 851 u32 = RTA_DATA(rtattr); 852 *u32 = tswap32(*u32); 853 break; 854 /* struct rtnl_link_stats */ 855 case QEMU_IFLA_STATS: 856 st = RTA_DATA(rtattr); 857 st->rx_packets = tswap32(st->rx_packets); 858 st->tx_packets = tswap32(st->tx_packets); 859 st->rx_bytes = tswap32(st->rx_bytes); 860 st->tx_bytes = tswap32(st->tx_bytes); 861 st->rx_errors = tswap32(st->rx_errors); 862 st->tx_errors = tswap32(st->tx_errors); 863 st->rx_dropped = tswap32(st->rx_dropped); 864 st->tx_dropped = tswap32(st->tx_dropped); 865 st->multicast = tswap32(st->multicast); 866 st->collisions = tswap32(st->collisions); 867 868 /* detailed rx_errors: */ 869 st->rx_length_errors = tswap32(st->rx_length_errors); 870 st->rx_over_errors = tswap32(st->rx_over_errors); 871 st->rx_crc_errors = tswap32(st->rx_crc_errors); 872 st->rx_frame_errors = tswap32(st->rx_frame_errors); 873 st->rx_fifo_errors = tswap32(st->rx_fifo_errors); 874 st->rx_missed_errors = tswap32(st->rx_missed_errors); 875 876 /* detailed tx_errors */ 877 st->tx_aborted_errors = tswap32(st->tx_aborted_errors); 878 st->tx_carrier_errors = tswap32(st->tx_carrier_errors); 879 st->tx_fifo_errors = tswap32(st->tx_fifo_errors); 880 st->tx_heartbeat_errors = tswap32(st->tx_heartbeat_errors); 881 st->tx_window_errors = tswap32(st->tx_window_errors); 882 883 /* for cslip etc */ 884 st->rx_compressed = tswap32(st->rx_compressed); 885 st->tx_compressed = tswap32(st->tx_compressed); 886 break; 887 /* struct rtnl_link_stats64 */ 888 case QEMU_IFLA_STATS64: 889 st64 = RTA_DATA(rtattr); 890 st64->rx_packets = tswap64(st64->rx_packets); 891 st64->tx_packets = tswap64(st64->tx_packets); 892 st64->rx_bytes = tswap64(st64->rx_bytes); 893 st64->tx_bytes = tswap64(st64->tx_bytes); 894 st64->rx_errors = tswap64(st64->rx_errors); 895 st64->tx_errors = tswap64(st64->tx_errors); 896 st64->rx_dropped = tswap64(st64->rx_dropped); 897 st64->tx_dropped = tswap64(st64->tx_dropped); 898 st64->multicast = tswap64(st64->multicast); 899 st64->collisions = tswap64(st64->collisions); 900 901 /* detailed rx_errors: */ 902 st64->rx_length_errors = tswap64(st64->rx_length_errors); 903 st64->rx_over_errors = tswap64(st64->rx_over_errors); 904 st64->rx_crc_errors = tswap64(st64->rx_crc_errors); 905 st64->rx_frame_errors = tswap64(st64->rx_frame_errors); 906 st64->rx_fifo_errors = tswap64(st64->rx_fifo_errors); 907 st64->rx_missed_errors = tswap64(st64->rx_missed_errors); 908 909 /* detailed tx_errors */ 910 st64->tx_aborted_errors = tswap64(st64->tx_aborted_errors); 911 st64->tx_carrier_errors = tswap64(st64->tx_carrier_errors); 912 st64->tx_fifo_errors = tswap64(st64->tx_fifo_errors); 913 st64->tx_heartbeat_errors = tswap64(st64->tx_heartbeat_errors); 914 st64->tx_window_errors = tswap64(st64->tx_window_errors); 915 916 /* for cslip etc */ 917 st64->rx_compressed = tswap64(st64->rx_compressed); 918 st64->tx_compressed = tswap64(st64->tx_compressed); 919 break; 920 /* struct rtnl_link_ifmap */ 921 case QEMU_IFLA_MAP: 922 map = RTA_DATA(rtattr); 923 map->mem_start = tswap64(map->mem_start); 924 map->mem_end = tswap64(map->mem_end); 925 map->base_addr = tswap64(map->base_addr); 926 map->irq = tswap16(map->irq); 927 break; 928 /* nested */ 929 case QEMU_IFLA_LINKINFO: 930 memset(&li_context, 0, sizeof(li_context)); 931 return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len, 932 &li_context, 933 host_to_target_data_linkinfo_nlattr); 934 case QEMU_IFLA_AF_SPEC: 935 return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len, 936 NULL, 937 host_to_target_data_spec_nlattr); 938 case QEMU_IFLA_XDP: 939 return host_to_target_for_each_nlattr(RTA_DATA(rtattr), rtattr->rta_len, 940 NULL, 941 host_to_target_data_xdp_nlattr); 942 default: 943 qemu_log_mask(LOG_UNIMP, "Unknown host QEMU_IFLA type: %d\n", 944 rtattr->rta_type); 945 break; 946 } 947 return 0; 948 } 949 950 static abi_long host_to_target_data_addr_rtattr(struct rtattr *rtattr) 951 { 952 uint32_t *u32; 953 struct ifa_cacheinfo *ci; 954 955 switch (rtattr->rta_type) { 956 /* binary: depends on family type */ 957 case IFA_ADDRESS: 958 case IFA_LOCAL: 959 break; 960 /* string */ 961 case IFA_LABEL: 962 break; 963 /* u32 */ 964 case IFA_FLAGS: 965 case IFA_BROADCAST: 966 u32 = RTA_DATA(rtattr); 967 *u32 = tswap32(*u32); 968 break; 969 /* struct ifa_cacheinfo */ 970 case IFA_CACHEINFO: 971 ci = RTA_DATA(rtattr); 972 ci->ifa_prefered = tswap32(ci->ifa_prefered); 973 ci->ifa_valid = tswap32(ci->ifa_valid); 974 ci->cstamp = tswap32(ci->cstamp); 975 ci->tstamp = tswap32(ci->tstamp); 976 break; 977 default: 978 qemu_log_mask( 979 LOG_UNIMP, "Unknown host IFA type: %d\n", rtattr->rta_type); 980 break; 981 } 982 return 0; 983 } 984 985 static abi_long host_to_target_data_route_rtattr(struct rtattr *rtattr) 986 { 987 uint32_t *u32; 988 struct rta_cacheinfo *ci; 989 990 switch (rtattr->rta_type) { 991 /* binary: depends on family type */ 992 case QEMU_RTA_GATEWAY: 993 case QEMU_RTA_DST: 994 case QEMU_RTA_PREFSRC: 995 break; 996 /* u8 */ 997 case QEMU_RTA_PREF: 998 break; 999 /* u32 */ 1000 case QEMU_RTA_PRIORITY: 1001 case QEMU_RTA_TABLE: 1002 case QEMU_RTA_OIF: 1003 u32 = RTA_DATA(rtattr); 1004 *u32 = tswap32(*u32); 1005 break; 1006 /* struct rta_cacheinfo */ 1007 case QEMU_RTA_CACHEINFO: 1008 ci = RTA_DATA(rtattr); 1009 ci->rta_clntref = tswap32(ci->rta_clntref); 1010 ci->rta_lastuse = tswap32(ci->rta_lastuse); 1011 ci->rta_expires = tswap32(ci->rta_expires); 1012 ci->rta_error = tswap32(ci->rta_error); 1013 ci->rta_used = tswap32(ci->rta_used); 1014 #if defined(RTNETLINK_HAVE_PEERINFO) 1015 ci->rta_id = tswap32(ci->rta_id); 1016 ci->rta_ts = tswap32(ci->rta_ts); 1017 ci->rta_tsage = tswap32(ci->rta_tsage); 1018 #endif 1019 break; 1020 default: 1021 qemu_log_mask( 1022 LOG_UNIMP, "Unknown host RTA type: %d\n", rtattr->rta_type); 1023 break; 1024 } 1025 return 0; 1026 } 1027 1028 static abi_long host_to_target_link_rtattr(struct rtattr *rtattr, 1029 uint32_t rtattr_len) 1030 { 1031 return host_to_target_for_each_rtattr(rtattr, rtattr_len, 1032 host_to_target_data_link_rtattr); 1033 } 1034 1035 static abi_long host_to_target_addr_rtattr(struct rtattr *rtattr, 1036 uint32_t rtattr_len) 1037 { 1038 return host_to_target_for_each_rtattr(rtattr, rtattr_len, 1039 host_to_target_data_addr_rtattr); 1040 } 1041 1042 static abi_long host_to_target_route_rtattr(struct rtattr *rtattr, 1043 uint32_t rtattr_len) 1044 { 1045 return host_to_target_for_each_rtattr(rtattr, rtattr_len, 1046 host_to_target_data_route_rtattr); 1047 } 1048 1049 static abi_long host_to_target_data_route(struct nlmsghdr *nlh) 1050 { 1051 uint32_t nlmsg_len; 1052 struct ifinfomsg *ifi; 1053 struct ifaddrmsg *ifa; 1054 struct rtmsg *rtm; 1055 1056 nlmsg_len = nlh->nlmsg_len; 1057 switch (nlh->nlmsg_type) { 1058 case RTM_NEWLINK: 1059 case RTM_DELLINK: 1060 case RTM_GETLINK: 1061 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ifi))) { 1062 ifi = NLMSG_DATA(nlh); 1063 ifi->ifi_type = tswap16(ifi->ifi_type); 1064 ifi->ifi_index = tswap32(ifi->ifi_index); 1065 ifi->ifi_flags = tswap32(ifi->ifi_flags); 1066 ifi->ifi_change = tswap32(ifi->ifi_change); 1067 host_to_target_link_rtattr(IFLA_RTA(ifi), 1068 nlmsg_len - NLMSG_LENGTH(sizeof(*ifi))); 1069 } 1070 break; 1071 case RTM_NEWADDR: 1072 case RTM_DELADDR: 1073 case RTM_GETADDR: 1074 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ifa))) { 1075 ifa = NLMSG_DATA(nlh); 1076 ifa->ifa_index = tswap32(ifa->ifa_index); 1077 host_to_target_addr_rtattr(IFA_RTA(ifa), 1078 nlmsg_len - NLMSG_LENGTH(sizeof(*ifa))); 1079 } 1080 break; 1081 case RTM_NEWROUTE: 1082 case RTM_DELROUTE: 1083 case RTM_GETROUTE: 1084 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*rtm))) { 1085 rtm = NLMSG_DATA(nlh); 1086 rtm->rtm_flags = tswap32(rtm->rtm_flags); 1087 host_to_target_route_rtattr(RTM_RTA(rtm), 1088 nlmsg_len - NLMSG_LENGTH(sizeof(*rtm))); 1089 } 1090 break; 1091 default: 1092 return -TARGET_EINVAL; 1093 } 1094 return 0; 1095 } 1096 1097 static inline abi_long host_to_target_nlmsg_route(struct nlmsghdr *nlh, 1098 size_t len) 1099 { 1100 return host_to_target_for_each_nlmsg(nlh, len, host_to_target_data_route); 1101 } 1102 1103 static abi_long target_to_host_for_each_rtattr(struct rtattr *rtattr, 1104 size_t len, 1105 abi_long (*target_to_host_rtattr) 1106 (struct rtattr *)) 1107 { 1108 unsigned short aligned_rta_len; 1109 abi_long ret; 1110 1111 while (len >= sizeof(struct rtattr)) { 1112 if (tswap16(rtattr->rta_len) < sizeof(struct rtattr) || 1113 tswap16(rtattr->rta_len) > len) { 1114 break; 1115 } 1116 rtattr->rta_len = tswap16(rtattr->rta_len); 1117 rtattr->rta_type = tswap16(rtattr->rta_type); 1118 ret = target_to_host_rtattr(rtattr); 1119 if (ret < 0) { 1120 return ret; 1121 } 1122 1123 aligned_rta_len = RTA_ALIGN(rtattr->rta_len); 1124 if (aligned_rta_len >= len) { 1125 break; 1126 } 1127 len -= aligned_rta_len; 1128 rtattr = (struct rtattr *)(((char *)rtattr) + aligned_rta_len); 1129 } 1130 return 0; 1131 } 1132 1133 static abi_long target_to_host_data_link_rtattr(struct rtattr *rtattr) 1134 { 1135 uint32_t *u32; 1136 1137 switch (rtattr->rta_type) { 1138 /* uint32_t */ 1139 case QEMU_IFLA_EXT_MASK: 1140 u32 = RTA_DATA(rtattr); 1141 *u32 = tswap32(*u32); 1142 break; 1143 default: 1144 qemu_log_mask(LOG_UNIMP, "Unknown target QEMU_IFLA type: %d\n", 1145 rtattr->rta_type); 1146 break; 1147 } 1148 return 0; 1149 } 1150 1151 static abi_long target_to_host_data_addr_rtattr(struct rtattr *rtattr) 1152 { 1153 switch (rtattr->rta_type) { 1154 /* binary: depends on family type */ 1155 case IFA_LOCAL: 1156 case IFA_ADDRESS: 1157 break; 1158 default: 1159 qemu_log_mask(LOG_UNIMP, "Unknown target IFA type: %d\n", 1160 rtattr->rta_type); 1161 break; 1162 } 1163 return 0; 1164 } 1165 1166 static abi_long target_to_host_data_route_rtattr(struct rtattr *rtattr) 1167 { 1168 uint32_t *u32; 1169 switch (rtattr->rta_type) { 1170 /* binary: depends on family type */ 1171 case QEMU_RTA_DST: 1172 case QEMU_RTA_SRC: 1173 case QEMU_RTA_GATEWAY: 1174 break; 1175 /* u32 */ 1176 case QEMU_RTA_PRIORITY: 1177 case QEMU_RTA_TABLE: 1178 case QEMU_RTA_OIF: 1179 u32 = RTA_DATA(rtattr); 1180 *u32 = tswap32(*u32); 1181 break; 1182 default: 1183 qemu_log_mask(LOG_UNIMP, "Unknown target RTA type: %d\n", 1184 rtattr->rta_type); 1185 break; 1186 } 1187 return 0; 1188 } 1189 1190 static void target_to_host_link_rtattr(struct rtattr *rtattr, 1191 uint32_t rtattr_len) 1192 { 1193 target_to_host_for_each_rtattr(rtattr, rtattr_len, 1194 target_to_host_data_link_rtattr); 1195 } 1196 1197 static void target_to_host_addr_rtattr(struct rtattr *rtattr, 1198 uint32_t rtattr_len) 1199 { 1200 target_to_host_for_each_rtattr(rtattr, rtattr_len, 1201 target_to_host_data_addr_rtattr); 1202 } 1203 1204 static void target_to_host_route_rtattr(struct rtattr *rtattr, 1205 uint32_t rtattr_len) 1206 { 1207 target_to_host_for_each_rtattr(rtattr, rtattr_len, 1208 target_to_host_data_route_rtattr); 1209 } 1210 1211 static abi_long target_to_host_data_route(struct nlmsghdr *nlh) 1212 { 1213 struct ifinfomsg *ifi; 1214 struct ifaddrmsg *ifa; 1215 struct rtmsg *rtm; 1216 1217 switch (nlh->nlmsg_type) { 1218 case RTM_NEWLINK: 1219 case RTM_DELLINK: 1220 case RTM_SETLINK: 1221 case RTM_GETLINK: 1222 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ifi))) { 1223 ifi = NLMSG_DATA(nlh); 1224 ifi->ifi_type = tswap16(ifi->ifi_type); 1225 ifi->ifi_index = tswap32(ifi->ifi_index); 1226 ifi->ifi_flags = tswap32(ifi->ifi_flags); 1227 ifi->ifi_change = tswap32(ifi->ifi_change); 1228 target_to_host_link_rtattr(IFLA_RTA(ifi), nlh->nlmsg_len - 1229 NLMSG_LENGTH(sizeof(*ifi))); 1230 } 1231 break; 1232 case RTM_GETADDR: 1233 case RTM_NEWADDR: 1234 case RTM_DELADDR: 1235 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*ifa))) { 1236 ifa = NLMSG_DATA(nlh); 1237 ifa->ifa_index = tswap32(ifa->ifa_index); 1238 target_to_host_addr_rtattr(IFA_RTA(ifa), nlh->nlmsg_len - 1239 NLMSG_LENGTH(sizeof(*ifa))); 1240 } 1241 break; 1242 case RTM_NEWROUTE: 1243 case RTM_DELROUTE: 1244 case RTM_GETROUTE: 1245 if (nlh->nlmsg_len >= NLMSG_LENGTH(sizeof(*rtm))) { 1246 rtm = NLMSG_DATA(nlh); 1247 rtm->rtm_flags = tswap32(rtm->rtm_flags); 1248 target_to_host_route_rtattr(RTM_RTA(rtm), nlh->nlmsg_len - 1249 NLMSG_LENGTH(sizeof(*rtm))); 1250 } 1251 break; 1252 default: 1253 return -TARGET_EOPNOTSUPP; 1254 } 1255 return 0; 1256 } 1257 1258 static abi_long target_to_host_nlmsg_route(struct nlmsghdr *nlh, size_t len) 1259 { 1260 return target_to_host_for_each_nlmsg(nlh, len, target_to_host_data_route); 1261 } 1262 #endif /* CONFIG_RTNETLINK */ 1263 1264 static abi_long host_to_target_data_audit(struct nlmsghdr *nlh) 1265 { 1266 switch (nlh->nlmsg_type) { 1267 default: 1268 qemu_log_mask(LOG_UNIMP, "Unknown host audit message type %d\n", 1269 nlh->nlmsg_type); 1270 return -TARGET_EINVAL; 1271 } 1272 return 0; 1273 } 1274 1275 static inline abi_long host_to_target_nlmsg_audit(struct nlmsghdr *nlh, 1276 size_t len) 1277 { 1278 return host_to_target_for_each_nlmsg(nlh, len, host_to_target_data_audit); 1279 } 1280 1281 static abi_long target_to_host_data_audit(struct nlmsghdr *nlh) 1282 { 1283 switch (nlh->nlmsg_type) { 1284 case AUDIT_USER: 1285 case AUDIT_FIRST_USER_MSG ... AUDIT_LAST_USER_MSG: 1286 case AUDIT_FIRST_USER_MSG2 ... AUDIT_LAST_USER_MSG2: 1287 break; 1288 default: 1289 qemu_log_mask(LOG_UNIMP, "Unknown target audit message type %d\n", 1290 nlh->nlmsg_type); 1291 return -TARGET_EINVAL; 1292 } 1293 1294 return 0; 1295 } 1296 1297 static abi_long target_to_host_nlmsg_audit(struct nlmsghdr *nlh, size_t len) 1298 { 1299 return target_to_host_for_each_nlmsg(nlh, len, target_to_host_data_audit); 1300 } 1301 1302 static abi_long packet_target_to_host_sockaddr(void *host_addr, 1303 abi_ulong target_addr, 1304 socklen_t len) 1305 { 1306 struct sockaddr *addr = host_addr; 1307 struct target_sockaddr *target_saddr; 1308 1309 target_saddr = lock_user(VERIFY_READ, target_addr, len, 1); 1310 if (!target_saddr) { 1311 return -TARGET_EFAULT; 1312 } 1313 1314 memcpy(addr, target_saddr, len); 1315 addr->sa_family = tswap16(target_saddr->sa_family); 1316 /* spkt_protocol is big-endian */ 1317 1318 unlock_user(target_saddr, target_addr, 0); 1319 return 0; 1320 } 1321 1322 TargetFdTrans target_packet_trans = { 1323 .target_to_host_addr = packet_target_to_host_sockaddr, 1324 }; 1325 1326 #ifdef CONFIG_RTNETLINK 1327 static abi_long netlink_route_target_to_host(void *buf, size_t len) 1328 { 1329 abi_long ret; 1330 1331 ret = target_to_host_nlmsg_route(buf, len); 1332 if (ret < 0) { 1333 return ret; 1334 } 1335 1336 return len; 1337 } 1338 1339 static abi_long netlink_route_host_to_target(void *buf, size_t len) 1340 { 1341 abi_long ret; 1342 1343 ret = host_to_target_nlmsg_route(buf, len); 1344 if (ret < 0) { 1345 return ret; 1346 } 1347 1348 return len; 1349 } 1350 1351 TargetFdTrans target_netlink_route_trans = { 1352 .target_to_host_data = netlink_route_target_to_host, 1353 .host_to_target_data = netlink_route_host_to_target, 1354 }; 1355 #endif /* CONFIG_RTNETLINK */ 1356 1357 static abi_long netlink_audit_target_to_host(void *buf, size_t len) 1358 { 1359 abi_long ret; 1360 1361 ret = target_to_host_nlmsg_audit(buf, len); 1362 if (ret < 0) { 1363 return ret; 1364 } 1365 1366 return len; 1367 } 1368 1369 static abi_long netlink_audit_host_to_target(void *buf, size_t len) 1370 { 1371 abi_long ret; 1372 1373 ret = host_to_target_nlmsg_audit(buf, len); 1374 if (ret < 0) { 1375 return ret; 1376 } 1377 1378 return len; 1379 } 1380 1381 TargetFdTrans target_netlink_audit_trans = { 1382 .target_to_host_data = netlink_audit_target_to_host, 1383 .host_to_target_data = netlink_audit_host_to_target, 1384 }; 1385 1386 /* signalfd siginfo conversion */ 1387 1388 static void 1389 host_to_target_signalfd_siginfo(struct signalfd_siginfo *tinfo, 1390 const struct signalfd_siginfo *info) 1391 { 1392 int sig = host_to_target_signal(info->ssi_signo); 1393 1394 /* linux/signalfd.h defines a ssi_addr_lsb 1395 * not defined in sys/signalfd.h but used by some kernels 1396 */ 1397 1398 #ifdef BUS_MCEERR_AO 1399 if (tinfo->ssi_signo == SIGBUS && 1400 (tinfo->ssi_code == BUS_MCEERR_AR || 1401 tinfo->ssi_code == BUS_MCEERR_AO)) { 1402 uint16_t *ssi_addr_lsb = (uint16_t *)(&info->ssi_addr + 1); 1403 uint16_t *tssi_addr_lsb = (uint16_t *)(&tinfo->ssi_addr + 1); 1404 *tssi_addr_lsb = tswap16(*ssi_addr_lsb); 1405 } 1406 #endif 1407 1408 tinfo->ssi_signo = tswap32(sig); 1409 tinfo->ssi_errno = tswap32(tinfo->ssi_errno); 1410 tinfo->ssi_code = tswap32(info->ssi_code); 1411 tinfo->ssi_pid = tswap32(info->ssi_pid); 1412 tinfo->ssi_uid = tswap32(info->ssi_uid); 1413 tinfo->ssi_fd = tswap32(info->ssi_fd); 1414 tinfo->ssi_tid = tswap32(info->ssi_tid); 1415 tinfo->ssi_band = tswap32(info->ssi_band); 1416 tinfo->ssi_overrun = tswap32(info->ssi_overrun); 1417 tinfo->ssi_trapno = tswap32(info->ssi_trapno); 1418 tinfo->ssi_status = tswap32(info->ssi_status); 1419 tinfo->ssi_int = tswap32(info->ssi_int); 1420 tinfo->ssi_ptr = tswap64(info->ssi_ptr); 1421 tinfo->ssi_utime = tswap64(info->ssi_utime); 1422 tinfo->ssi_stime = tswap64(info->ssi_stime); 1423 tinfo->ssi_addr = tswap64(info->ssi_addr); 1424 } 1425 1426 static abi_long host_to_target_data_signalfd(void *buf, size_t len) 1427 { 1428 int i; 1429 1430 for (i = 0; i < len; i += sizeof(struct signalfd_siginfo)) { 1431 host_to_target_signalfd_siginfo(buf + i, buf + i); 1432 } 1433 1434 return len; 1435 } 1436 1437 TargetFdTrans target_signalfd_trans = { 1438 .host_to_target_data = host_to_target_data_signalfd, 1439 }; 1440 1441 static abi_long swap_data_eventfd(void *buf, size_t len) 1442 { 1443 uint64_t *counter = buf; 1444 int i; 1445 1446 if (len < sizeof(uint64_t)) { 1447 return -EINVAL; 1448 } 1449 1450 for (i = 0; i < len; i += sizeof(uint64_t)) { 1451 *counter = tswap64(*counter); 1452 counter++; 1453 } 1454 1455 return len; 1456 } 1457 1458 TargetFdTrans target_eventfd_trans = { 1459 .host_to_target_data = swap_data_eventfd, 1460 .target_to_host_data = swap_data_eventfd, 1461 }; 1462 1463 #if (defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)) || \ 1464 (defined(CONFIG_INOTIFY1) && defined(TARGET_NR_inotify_init1) && \ 1465 defined(__NR_inotify_init1)) 1466 static abi_long host_to_target_data_inotify(void *buf, size_t len) 1467 { 1468 struct inotify_event *ev; 1469 int i; 1470 uint32_t name_len; 1471 1472 for (i = 0; i < len; i += sizeof(struct inotify_event) + name_len) { 1473 ev = (struct inotify_event *)((char *)buf + i); 1474 name_len = ev->len; 1475 1476 ev->wd = tswap32(ev->wd); 1477 ev->mask = tswap32(ev->mask); 1478 ev->cookie = tswap32(ev->cookie); 1479 ev->len = tswap32(name_len); 1480 } 1481 1482 return len; 1483 } 1484 1485 TargetFdTrans target_inotify_trans = { 1486 .host_to_target_data = host_to_target_data_inotify, 1487 }; 1488 #endif 1489