fd-trans.c 56 KB

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