qemu/linux-user/fd-trans.c
<<
>>
Prefs
   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
  34enum {
  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
  85enum {
  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
 144enum {
 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
 185enum {
 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
 199enum {
 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
 209enum {
 210    QEMU_IFLA_INET_UNSPEC,
 211    QEMU_IFLA_INET_CONF,
 212    QEMU___IFLA_INET_MAX,
 213};
 214
 215enum {
 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
 228enum {
 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
 237enum {
 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
 271TargetFdTrans **target_fd_trans;
 272QemuMutex target_fd_trans_lock;
 273unsigned int target_fd_max;
 274
 275static 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
 284static 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
 335static 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
 379static 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
 412static 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
 446static 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
 532static 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
 598static 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
 627struct linkinfo_context {
 628    int len;
 629    char *name;
 630    int slave_len;
 631    char *slave_name;
 632};
 633
 634static 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
 693static 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
 714static 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
 766static 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
 786static 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
 808static 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
 950static 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
 985static 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
1028static 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
1035static 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
1042static 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
1049static 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
1097static 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
1103static 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
1133static 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
1151static 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
1166static 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
1190static 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
1197static 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
1204static 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
1211static 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
1258static 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
1264static 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
1275static 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
1281static 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
1297static 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
1302static 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
1322TargetFdTrans target_packet_trans = {
1323    .target_to_host_addr = packet_target_to_host_sockaddr,
1324};
1325
1326#ifdef CONFIG_RTNETLINK
1327static 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
1339static 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
1351TargetFdTrans 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
1357static 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
1369static 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
1381TargetFdTrans 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
1388static void
1389host_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
1426static 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
1437TargetFdTrans target_signalfd_trans = {
1438    .host_to_target_data = host_to_target_data_signalfd,
1439};
1440
1441static 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
1458TargetFdTrans 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))
1466static 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
1485TargetFdTrans target_inotify_trans = {
1486    .host_to_target_data = host_to_target_data_inotify,
1487};
1488#endif
1489