fd-trans.c 52 KB

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