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