2
0

slirp.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242
  1. /*
  2. * QEMU System Emulator
  3. *
  4. * Copyright (c) 2003-2008 Fabrice Bellard
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #include "qemu/osdep.h"
  25. #include "qemu/log.h"
  26. #include "net/slirp.h"
  27. #if defined(CONFIG_SMBD_COMMAND)
  28. #include <pwd.h>
  29. #include <sys/wait.h>
  30. #endif
  31. #include "net/eth.h"
  32. #include "net/net.h"
  33. #include "clients.h"
  34. #include "hub.h"
  35. #include "monitor/monitor.h"
  36. #include "qemu/error-report.h"
  37. #include "qemu/sockets.h"
  38. #include <libslirp.h>
  39. #include "chardev/char-fe.h"
  40. #include "system/system.h"
  41. #include "qemu/cutils.h"
  42. #include "qapi/error.h"
  43. #include "qobject/qdict.h"
  44. #include "util.h"
  45. #include "migration/register.h"
  46. #include "migration/vmstate.h"
  47. #include "migration/qemu-file-types.h"
  48. static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
  49. {
  50. const char *p, *p1;
  51. int len;
  52. p = *pp;
  53. p1 = strchr(p, sep);
  54. if (!p1)
  55. return -1;
  56. len = p1 - p;
  57. p1++;
  58. if (buf_size > 0) {
  59. if (len > buf_size - 1)
  60. len = buf_size - 1;
  61. memcpy(buf, p, len);
  62. buf[len] = '\0';
  63. }
  64. *pp = p1;
  65. return 0;
  66. }
  67. /* slirp network adapter */
  68. #define SLIRP_CFG_HOSTFWD 1
  69. struct slirp_config_str {
  70. struct slirp_config_str *next;
  71. int flags;
  72. char str[1024];
  73. };
  74. struct GuestFwd {
  75. CharBackend hd;
  76. struct in_addr server;
  77. int port;
  78. Slirp *slirp;
  79. };
  80. typedef struct SlirpState {
  81. NetClientState nc;
  82. QTAILQ_ENTRY(SlirpState) entry;
  83. Slirp *slirp;
  84. Notifier poll_notifier;
  85. Notifier exit_notifier;
  86. #if defined(CONFIG_SMBD_COMMAND)
  87. gchar *smb_dir;
  88. #endif
  89. GSList *fwd;
  90. } SlirpState;
  91. static struct slirp_config_str *slirp_configs;
  92. static QTAILQ_HEAD(, SlirpState) slirp_stacks =
  93. QTAILQ_HEAD_INITIALIZER(slirp_stacks);
  94. static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp);
  95. static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp);
  96. #if defined(CONFIG_SMBD_COMMAND)
  97. static int slirp_smb(SlirpState *s, const char *exported_dir,
  98. struct in_addr vserver_addr, Error **errp);
  99. static void slirp_smb_cleanup(SlirpState *s);
  100. #else
  101. static inline void slirp_smb_cleanup(SlirpState *s) { }
  102. #endif
  103. static ssize_t net_slirp_send_packet(const void *pkt, size_t pkt_len,
  104. void *opaque)
  105. {
  106. SlirpState *s = opaque;
  107. uint8_t min_pkt[ETH_ZLEN];
  108. size_t min_pktsz = sizeof(min_pkt);
  109. if (net_peer_needs_padding(&s->nc)) {
  110. if (eth_pad_short_frame(min_pkt, &min_pktsz, pkt, pkt_len)) {
  111. pkt = min_pkt;
  112. pkt_len = min_pktsz;
  113. }
  114. }
  115. return qemu_send_packet(&s->nc, pkt, pkt_len);
  116. }
  117. static ssize_t net_slirp_receive(NetClientState *nc, const uint8_t *buf, size_t size)
  118. {
  119. SlirpState *s = DO_UPCAST(SlirpState, nc, nc);
  120. slirp_input(s->slirp, buf, size);
  121. return size;
  122. }
  123. static void slirp_smb_exit(Notifier *n, void *data)
  124. {
  125. SlirpState *s = container_of(n, SlirpState, exit_notifier);
  126. slirp_smb_cleanup(s);
  127. }
  128. static void slirp_free_fwd(gpointer data)
  129. {
  130. struct GuestFwd *fwd = data;
  131. qemu_chr_fe_deinit(&fwd->hd, true);
  132. g_free(data);
  133. }
  134. static void net_slirp_cleanup(NetClientState *nc)
  135. {
  136. SlirpState *s = DO_UPCAST(SlirpState, nc, nc);
  137. g_slist_free_full(s->fwd, slirp_free_fwd);
  138. main_loop_poll_remove_notifier(&s->poll_notifier);
  139. unregister_savevm(NULL, "slirp", s->slirp);
  140. slirp_cleanup(s->slirp);
  141. if (s->exit_notifier.notify) {
  142. qemu_remove_exit_notifier(&s->exit_notifier);
  143. }
  144. slirp_smb_cleanup(s);
  145. QTAILQ_REMOVE(&slirp_stacks, s, entry);
  146. }
  147. static NetClientInfo net_slirp_info = {
  148. .type = NET_CLIENT_DRIVER_USER,
  149. .size = sizeof(SlirpState),
  150. .receive = net_slirp_receive,
  151. .cleanup = net_slirp_cleanup,
  152. };
  153. static void net_slirp_guest_error(const char *msg, void *opaque)
  154. {
  155. qemu_log_mask(LOG_GUEST_ERROR, "%s", msg);
  156. }
  157. static int64_t net_slirp_clock_get_ns(void *opaque)
  158. {
  159. return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
  160. }
  161. typedef struct SlirpTimer SlirpTimer;
  162. struct SlirpTimer {
  163. QEMUTimer timer;
  164. #if SLIRP_CHECK_VERSION(4,7,0)
  165. Slirp *slirp;
  166. SlirpTimerId id;
  167. void *cb_opaque;
  168. #endif
  169. };
  170. #if SLIRP_CHECK_VERSION(4,7,0)
  171. static void net_slirp_init_completed(Slirp *slirp, void *opaque)
  172. {
  173. SlirpState *s = opaque;
  174. s->slirp = slirp;
  175. }
  176. static void net_slirp_timer_cb(void *opaque)
  177. {
  178. SlirpTimer *t = opaque;
  179. slirp_handle_timer(t->slirp, t->id, t->cb_opaque);
  180. }
  181. static void *net_slirp_timer_new_opaque(SlirpTimerId id,
  182. void *cb_opaque, void *opaque)
  183. {
  184. SlirpState *s = opaque;
  185. SlirpTimer *t = g_new(SlirpTimer, 1);
  186. t->slirp = s->slirp;
  187. t->id = id;
  188. t->cb_opaque = cb_opaque;
  189. timer_init_full(&t->timer, NULL, QEMU_CLOCK_VIRTUAL,
  190. SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
  191. net_slirp_timer_cb, t);
  192. return t;
  193. }
  194. #else
  195. static void *net_slirp_timer_new(SlirpTimerCb cb,
  196. void *cb_opaque, void *opaque)
  197. {
  198. SlirpTimer *t = g_new(SlirpTimer, 1);
  199. timer_init_full(&t->timer, NULL, QEMU_CLOCK_VIRTUAL,
  200. SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
  201. cb, cb_opaque);
  202. return t;
  203. }
  204. #endif
  205. static void net_slirp_timer_free(void *timer, void *opaque)
  206. {
  207. SlirpTimer *t = timer;
  208. timer_del(&t->timer);
  209. g_free(t);
  210. }
  211. static void net_slirp_timer_mod(void *timer, int64_t expire_timer,
  212. void *opaque)
  213. {
  214. SlirpTimer *t = timer;
  215. timer_mod(&t->timer, expire_timer);
  216. }
  217. #if !SLIRP_CHECK_VERSION(4, 9, 0)
  218. # define slirp_os_socket int
  219. # define slirp_pollfds_fill_socket slirp_pollfds_fill
  220. # define register_poll_socket register_poll_fd
  221. # define unregister_poll_socket unregister_poll_fd
  222. #endif
  223. static void net_slirp_register_poll_sock(slirp_os_socket fd, void *opaque)
  224. {
  225. #ifdef WIN32
  226. AioContext *ctxt = qemu_get_aio_context();
  227. if (WSAEventSelect(fd, event_notifier_get_handle(&ctxt->notifier),
  228. FD_READ | FD_ACCEPT | FD_CLOSE |
  229. FD_CONNECT | FD_WRITE | FD_OOB) != 0) {
  230. error_setg_win32(&error_warn, WSAGetLastError(), "failed to WSAEventSelect()");
  231. }
  232. #endif
  233. }
  234. static void net_slirp_unregister_poll_sock(slirp_os_socket fd, void *opaque)
  235. {
  236. #ifdef WIN32
  237. if (WSAEventSelect(fd, NULL, 0) != 0) {
  238. error_setg_win32(&error_warn, WSAGetLastError(), "failed to WSAEventSelect()");
  239. }
  240. #endif
  241. }
  242. static void net_slirp_notify(void *opaque)
  243. {
  244. qemu_notify_event();
  245. }
  246. static const SlirpCb slirp_cb = {
  247. .send_packet = net_slirp_send_packet,
  248. .guest_error = net_slirp_guest_error,
  249. .clock_get_ns = net_slirp_clock_get_ns,
  250. #if SLIRP_CHECK_VERSION(4,7,0)
  251. .init_completed = net_slirp_init_completed,
  252. .timer_new_opaque = net_slirp_timer_new_opaque,
  253. #else
  254. .timer_new = net_slirp_timer_new,
  255. #endif
  256. .timer_free = net_slirp_timer_free,
  257. .timer_mod = net_slirp_timer_mod,
  258. .register_poll_socket = net_slirp_register_poll_sock,
  259. .unregister_poll_socket = net_slirp_unregister_poll_sock,
  260. .notify = net_slirp_notify,
  261. };
  262. static int slirp_poll_to_gio(int events)
  263. {
  264. int ret = 0;
  265. if (events & SLIRP_POLL_IN) {
  266. ret |= G_IO_IN;
  267. }
  268. if (events & SLIRP_POLL_OUT) {
  269. ret |= G_IO_OUT;
  270. }
  271. if (events & SLIRP_POLL_PRI) {
  272. ret |= G_IO_PRI;
  273. }
  274. if (events & SLIRP_POLL_ERR) {
  275. ret |= G_IO_ERR;
  276. }
  277. if (events & SLIRP_POLL_HUP) {
  278. ret |= G_IO_HUP;
  279. }
  280. return ret;
  281. }
  282. static int net_slirp_add_poll(slirp_os_socket fd, int events, void *opaque)
  283. {
  284. GArray *pollfds = opaque;
  285. GPollFD pfd = {
  286. .fd = fd,
  287. .events = slirp_poll_to_gio(events),
  288. };
  289. int idx = pollfds->len;
  290. g_array_append_val(pollfds, pfd);
  291. return idx;
  292. }
  293. static int slirp_gio_to_poll(int events)
  294. {
  295. int ret = 0;
  296. if (events & G_IO_IN) {
  297. ret |= SLIRP_POLL_IN;
  298. }
  299. if (events & G_IO_OUT) {
  300. ret |= SLIRP_POLL_OUT;
  301. }
  302. if (events & G_IO_PRI) {
  303. ret |= SLIRP_POLL_PRI;
  304. }
  305. if (events & G_IO_ERR) {
  306. ret |= SLIRP_POLL_ERR;
  307. }
  308. if (events & G_IO_HUP) {
  309. ret |= SLIRP_POLL_HUP;
  310. }
  311. return ret;
  312. }
  313. static int net_slirp_get_revents(int idx, void *opaque)
  314. {
  315. GArray *pollfds = opaque;
  316. return slirp_gio_to_poll(g_array_index(pollfds, GPollFD, idx).revents);
  317. }
  318. static void net_slirp_poll_notify(Notifier *notifier, void *data)
  319. {
  320. MainLoopPoll *poll = data;
  321. SlirpState *s = container_of(notifier, SlirpState, poll_notifier);
  322. switch (poll->state) {
  323. case MAIN_LOOP_POLL_FILL:
  324. slirp_pollfds_fill_socket(s->slirp, &poll->timeout,
  325. net_slirp_add_poll, poll->pollfds);
  326. break;
  327. case MAIN_LOOP_POLL_OK:
  328. case MAIN_LOOP_POLL_ERR:
  329. slirp_pollfds_poll(s->slirp, poll->state == MAIN_LOOP_POLL_ERR,
  330. net_slirp_get_revents, poll->pollfds);
  331. break;
  332. default:
  333. g_assert_not_reached();
  334. }
  335. }
  336. static ssize_t
  337. net_slirp_stream_read(void *buf, size_t size, void *opaque)
  338. {
  339. QEMUFile *f = opaque;
  340. return qemu_get_buffer(f, buf, size);
  341. }
  342. static ssize_t
  343. net_slirp_stream_write(const void *buf, size_t size, void *opaque)
  344. {
  345. QEMUFile *f = opaque;
  346. qemu_put_buffer(f, buf, size);
  347. if (qemu_file_get_error(f)) {
  348. return -1;
  349. }
  350. return size;
  351. }
  352. static int net_slirp_state_load(QEMUFile *f, void *opaque, int version_id)
  353. {
  354. Slirp *slirp = opaque;
  355. return slirp_state_load(slirp, version_id, net_slirp_stream_read, f);
  356. }
  357. static void net_slirp_state_save(QEMUFile *f, void *opaque)
  358. {
  359. Slirp *slirp = opaque;
  360. slirp_state_save(slirp, net_slirp_stream_write, f);
  361. }
  362. static SaveVMHandlers savevm_slirp_state = {
  363. .save_state = net_slirp_state_save,
  364. .load_state = net_slirp_state_load,
  365. };
  366. static int net_slirp_init(NetClientState *peer, const char *model,
  367. const char *name, int restricted,
  368. bool ipv4, const char *vnetwork, const char *vhost,
  369. bool ipv6, const char *vprefix6, int vprefix6_len,
  370. const char *vhost6,
  371. const char *vhostname, const char *tftp_export,
  372. const char *bootfile, const char *vdhcp_start,
  373. const char *vnameserver, const char *vnameserver6,
  374. const char *smb_export, const char *vsmbserver,
  375. const char **dnssearch, const char *vdomainname,
  376. const char *tftp_server_name,
  377. Error **errp)
  378. {
  379. /* default settings according to historic slirp */
  380. struct in_addr net = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
  381. struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
  382. struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */
  383. struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
  384. struct in_addr dns = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
  385. struct in6_addr ip6_prefix;
  386. struct in6_addr ip6_host;
  387. struct in6_addr ip6_dns;
  388. #if defined(CONFIG_SMBD_COMMAND)
  389. struct in_addr smbsrv = { .s_addr = 0 };
  390. #endif
  391. SlirpConfig cfg = { 0 };
  392. NetClientState *nc;
  393. SlirpState *s;
  394. char buf[20];
  395. uint32_t addr;
  396. int shift;
  397. char *end;
  398. struct slirp_config_str *config;
  399. if (!ipv4 && (vnetwork || vhost || vnameserver)) {
  400. error_setg(errp, "IPv4 disabled but netmask/host/dns provided");
  401. return -1;
  402. }
  403. if (!ipv6 && (vprefix6 || vhost6 || vnameserver6)) {
  404. error_setg(errp, "IPv6 disabled but prefix/host6/dns6 provided");
  405. return -1;
  406. }
  407. if (!ipv4 && !ipv6) {
  408. /* It doesn't make sense to disable both */
  409. error_setg(errp, "IPv4 and IPv6 disabled");
  410. return -1;
  411. }
  412. if (vnetwork) {
  413. if (get_str_sep(buf, sizeof(buf), &vnetwork, '/') < 0) {
  414. if (!inet_aton(vnetwork, &net)) {
  415. error_setg(errp, "Failed to parse netmask");
  416. return -1;
  417. }
  418. addr = ntohl(net.s_addr);
  419. if (!(addr & 0x80000000)) {
  420. mask.s_addr = htonl(0xff000000); /* class A */
  421. } else if ((addr & 0xfff00000) == 0xac100000) {
  422. mask.s_addr = htonl(0xfff00000); /* priv. 172.16.0.0/12 */
  423. } else if ((addr & 0xc0000000) == 0x80000000) {
  424. mask.s_addr = htonl(0xffff0000); /* class B */
  425. } else if ((addr & 0xffff0000) == 0xc0a80000) {
  426. mask.s_addr = htonl(0xffff0000); /* priv. 192.168.0.0/16 */
  427. } else if ((addr & 0xffff0000) == 0xc6120000) {
  428. mask.s_addr = htonl(0xfffe0000); /* tests 198.18.0.0/15 */
  429. } else if ((addr & 0xe0000000) == 0xe0000000) {
  430. mask.s_addr = htonl(0xffffff00); /* class C */
  431. } else {
  432. mask.s_addr = htonl(0xfffffff0); /* multicast/reserved */
  433. }
  434. } else {
  435. if (!inet_aton(buf, &net)) {
  436. error_setg(errp, "Failed to parse netmask");
  437. return -1;
  438. }
  439. shift = strtol(vnetwork, &end, 10);
  440. if (*end != '\0') {
  441. if (!inet_aton(vnetwork, &mask)) {
  442. error_setg(errp,
  443. "Failed to parse netmask (trailing chars)");
  444. return -1;
  445. }
  446. } else if (shift < 4 || shift > 32) {
  447. error_setg(errp,
  448. "Invalid netmask provided (must be in range 4-32)");
  449. return -1;
  450. } else {
  451. mask.s_addr = htonl(0xffffffff << (32 - shift));
  452. }
  453. }
  454. net.s_addr &= mask.s_addr;
  455. host.s_addr = net.s_addr | (htonl(0x0202) & ~mask.s_addr);
  456. dhcp.s_addr = net.s_addr | (htonl(0x020f) & ~mask.s_addr);
  457. dns.s_addr = net.s_addr | (htonl(0x0203) & ~mask.s_addr);
  458. }
  459. if (vhost && !inet_aton(vhost, &host)) {
  460. error_setg(errp, "Failed to parse host");
  461. return -1;
  462. }
  463. if ((host.s_addr & mask.s_addr) != net.s_addr) {
  464. error_setg(errp, "Host doesn't belong to network");
  465. return -1;
  466. }
  467. if (vnameserver && !inet_aton(vnameserver, &dns)) {
  468. error_setg(errp, "Failed to parse DNS");
  469. return -1;
  470. }
  471. if (restricted && (dns.s_addr & mask.s_addr) != net.s_addr) {
  472. error_setg(errp, "DNS doesn't belong to network");
  473. return -1;
  474. }
  475. if (dns.s_addr == host.s_addr) {
  476. error_setg(errp, "DNS must be different from host");
  477. return -1;
  478. }
  479. if (vdhcp_start && !inet_aton(vdhcp_start, &dhcp)) {
  480. error_setg(errp, "Failed to parse DHCP start address");
  481. return -1;
  482. }
  483. if ((dhcp.s_addr & mask.s_addr) != net.s_addr) {
  484. error_setg(errp, "DHCP doesn't belong to network");
  485. return -1;
  486. }
  487. if (dhcp.s_addr == host.s_addr || dhcp.s_addr == dns.s_addr) {
  488. error_setg(errp, "DHCP must be different from host and DNS");
  489. return -1;
  490. }
  491. #if defined(CONFIG_SMBD_COMMAND)
  492. if (vsmbserver && !inet_aton(vsmbserver, &smbsrv)) {
  493. error_setg(errp, "Failed to parse SMB address");
  494. return -1;
  495. }
  496. #endif
  497. if (!vprefix6) {
  498. vprefix6 = "fec0::";
  499. }
  500. if (!inet_pton(AF_INET6, vprefix6, &ip6_prefix)) {
  501. error_setg(errp, "Failed to parse IPv6 prefix");
  502. return -1;
  503. }
  504. if (!vprefix6_len) {
  505. vprefix6_len = 64;
  506. }
  507. if (vprefix6_len < 0 || vprefix6_len > 126) {
  508. error_setg(errp,
  509. "Invalid IPv6 prefix provided "
  510. "(IPv6 prefix length must be between 0 and 126)");
  511. return -1;
  512. }
  513. if (vhost6) {
  514. if (!inet_pton(AF_INET6, vhost6, &ip6_host)) {
  515. error_setg(errp, "Failed to parse IPv6 host");
  516. return -1;
  517. }
  518. if (!in6_equal_net(&ip6_prefix, &ip6_host, vprefix6_len)) {
  519. error_setg(errp, "IPv6 Host doesn't belong to network");
  520. return -1;
  521. }
  522. } else {
  523. ip6_host = ip6_prefix;
  524. ip6_host.s6_addr[15] |= 2;
  525. }
  526. if (vnameserver6) {
  527. if (!inet_pton(AF_INET6, vnameserver6, &ip6_dns)) {
  528. error_setg(errp, "Failed to parse IPv6 DNS");
  529. return -1;
  530. }
  531. if (restricted && !in6_equal_net(&ip6_prefix, &ip6_dns, vprefix6_len)) {
  532. error_setg(errp, "IPv6 DNS doesn't belong to network");
  533. return -1;
  534. }
  535. } else {
  536. ip6_dns = ip6_prefix;
  537. ip6_dns.s6_addr[15] |= 3;
  538. }
  539. if (vdomainname && !*vdomainname) {
  540. error_setg(errp, "'domainname' parameter cannot be empty");
  541. return -1;
  542. }
  543. if (vdomainname && strlen(vdomainname) > 255) {
  544. error_setg(errp, "'domainname' parameter cannot exceed 255 bytes");
  545. return -1;
  546. }
  547. if (vhostname && strlen(vhostname) > 255) {
  548. error_setg(errp, "'vhostname' parameter cannot exceed 255 bytes");
  549. return -1;
  550. }
  551. if (tftp_server_name && strlen(tftp_server_name) > 255) {
  552. error_setg(errp, "'tftp-server-name' parameter cannot exceed 255 bytes");
  553. return -1;
  554. }
  555. nc = qemu_new_net_client(&net_slirp_info, peer, model, name);
  556. qemu_set_info_str(nc, "net=%s,restrict=%s", inet_ntoa(net),
  557. restricted ? "on" : "off");
  558. s = DO_UPCAST(SlirpState, nc, nc);
  559. cfg.version =
  560. SLIRP_CHECK_VERSION(4, 9, 0) ? 6 :
  561. SLIRP_CHECK_VERSION(4, 7, 0) ? 4 : 1;
  562. cfg.restricted = restricted;
  563. cfg.in_enabled = ipv4;
  564. cfg.vnetwork = net;
  565. cfg.vnetmask = mask;
  566. cfg.vhost = host;
  567. cfg.in6_enabled = ipv6;
  568. cfg.vprefix_addr6 = ip6_prefix;
  569. cfg.vprefix_len = vprefix6_len;
  570. cfg.vhost6 = ip6_host;
  571. cfg.vhostname = vhostname;
  572. cfg.tftp_server_name = tftp_server_name;
  573. cfg.tftp_path = tftp_export;
  574. cfg.bootfile = bootfile;
  575. cfg.vdhcp_start = dhcp;
  576. cfg.vnameserver = dns;
  577. cfg.vnameserver6 = ip6_dns;
  578. cfg.vdnssearch = dnssearch;
  579. cfg.vdomainname = vdomainname;
  580. s->slirp = slirp_new(&cfg, &slirp_cb, s);
  581. QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
  582. /*
  583. * Make sure the current bitstream version of slirp is 4, to avoid
  584. * QEMU migration incompatibilities, if upstream slirp bumped the
  585. * version.
  586. *
  587. * FIXME: use bitfields of features? teach libslirp to save with
  588. * specific version?
  589. */
  590. g_assert(slirp_state_version() == 4);
  591. register_savevm_live("slirp", VMSTATE_INSTANCE_ID_ANY,
  592. slirp_state_version(), &savevm_slirp_state, s->slirp);
  593. s->poll_notifier.notify = net_slirp_poll_notify;
  594. main_loop_poll_add_notifier(&s->poll_notifier);
  595. for (config = slirp_configs; config; config = config->next) {
  596. if (config->flags & SLIRP_CFG_HOSTFWD) {
  597. if (slirp_hostfwd(s, config->str, errp) < 0) {
  598. goto error;
  599. }
  600. } else {
  601. if (slirp_guestfwd(s, config->str, errp) < 0) {
  602. goto error;
  603. }
  604. }
  605. }
  606. #if defined(CONFIG_SMBD_COMMAND)
  607. if (smb_export) {
  608. if (slirp_smb(s, smb_export, smbsrv, errp) < 0) {
  609. goto error;
  610. }
  611. }
  612. #endif
  613. s->exit_notifier.notify = slirp_smb_exit;
  614. qemu_add_exit_notifier(&s->exit_notifier);
  615. return 0;
  616. error:
  617. qemu_del_net_client(nc);
  618. return -1;
  619. }
  620. static SlirpState *slirp_lookup(Monitor *mon, const char *id)
  621. {
  622. if (id) {
  623. NetClientState *nc = qemu_find_netdev(id);
  624. if (!nc) {
  625. monitor_printf(mon, "unrecognized netdev id '%s'\n", id);
  626. return NULL;
  627. }
  628. if (strcmp(nc->model, "user")) {
  629. monitor_printf(mon, "invalid device specified\n");
  630. return NULL;
  631. }
  632. return DO_UPCAST(SlirpState, nc, nc);
  633. } else {
  634. if (QTAILQ_EMPTY(&slirp_stacks)) {
  635. monitor_printf(mon, "user mode network stack not in use\n");
  636. return NULL;
  637. }
  638. return QTAILQ_FIRST(&slirp_stacks);
  639. }
  640. }
  641. void hmp_hostfwd_remove(Monitor *mon, const QDict *qdict)
  642. {
  643. struct sockaddr_in host_addr = {
  644. .sin_family = AF_INET,
  645. .sin_addr = {
  646. .s_addr = INADDR_ANY,
  647. },
  648. };
  649. int host_port;
  650. char buf[256];
  651. const char *src_str, *p;
  652. SlirpState *s;
  653. int is_udp = 0;
  654. int err;
  655. const char *arg1 = qdict_get_str(qdict, "arg1");
  656. const char *arg2 = qdict_get_try_str(qdict, "arg2");
  657. if (arg2) {
  658. s = slirp_lookup(mon, arg1);
  659. src_str = arg2;
  660. } else {
  661. s = slirp_lookup(mon, NULL);
  662. src_str = arg1;
  663. }
  664. if (!s) {
  665. return;
  666. }
  667. p = src_str;
  668. if (!p || get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
  669. goto fail_syntax;
  670. }
  671. if (!strcmp(buf, "tcp") || buf[0] == '\0') {
  672. is_udp = 0;
  673. } else if (!strcmp(buf, "udp")) {
  674. is_udp = 1;
  675. } else {
  676. goto fail_syntax;
  677. }
  678. if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
  679. goto fail_syntax;
  680. }
  681. if (buf[0] != '\0' && !inet_aton(buf, &host_addr.sin_addr)) {
  682. goto fail_syntax;
  683. }
  684. if (qemu_strtoi(p, NULL, 10, &host_port)) {
  685. goto fail_syntax;
  686. }
  687. host_addr.sin_port = htons(host_port);
  688. #if SLIRP_CHECK_VERSION(4, 5, 0)
  689. err = slirp_remove_hostxfwd(s->slirp, (struct sockaddr *) &host_addr,
  690. sizeof(host_addr), is_udp ? SLIRP_HOSTFWD_UDP : 0);
  691. #else
  692. err = slirp_remove_hostfwd(s->slirp, is_udp, host_addr.sin_addr, host_port);
  693. #endif
  694. monitor_printf(mon, "host forwarding rule for %s %s\n", src_str,
  695. err ? "not found" : "removed");
  696. return;
  697. fail_syntax:
  698. monitor_printf(mon, "invalid format\n");
  699. }
  700. static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp)
  701. {
  702. struct sockaddr_in host_addr = {
  703. .sin_family = AF_INET,
  704. .sin_addr = {
  705. .s_addr = INADDR_ANY,
  706. },
  707. };
  708. struct sockaddr_in guest_addr = {
  709. .sin_family = AF_INET,
  710. .sin_addr = {
  711. .s_addr = 0,
  712. },
  713. };
  714. int err;
  715. int host_port, guest_port;
  716. const char *p;
  717. char buf[256];
  718. int is_udp;
  719. const char *end;
  720. const char *fail_reason = "Unknown reason";
  721. p = redir_str;
  722. if (!p || get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
  723. fail_reason = "No : separators";
  724. goto fail_syntax;
  725. }
  726. if (!strcmp(buf, "tcp") || buf[0] == '\0') {
  727. is_udp = 0;
  728. } else if (!strcmp(buf, "udp")) {
  729. is_udp = 1;
  730. } else {
  731. fail_reason = "Bad protocol name";
  732. goto fail_syntax;
  733. }
  734. if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
  735. fail_reason = "Missing : separator";
  736. goto fail_syntax;
  737. }
  738. if (buf[0] != '\0' && !inet_aton(buf, &host_addr.sin_addr)) {
  739. fail_reason = "Bad host address";
  740. goto fail_syntax;
  741. }
  742. if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
  743. fail_reason = "Bad host port separator";
  744. goto fail_syntax;
  745. }
  746. err = qemu_strtoi(buf, &end, 0, &host_port);
  747. if (err || host_port < 0 || host_port > 65535) {
  748. fail_reason = "Bad host port";
  749. goto fail_syntax;
  750. }
  751. host_addr.sin_port = htons(host_port);
  752. if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
  753. fail_reason = "Missing guest address";
  754. goto fail_syntax;
  755. }
  756. if (buf[0] != '\0' && !inet_aton(buf, &guest_addr.sin_addr)) {
  757. fail_reason = "Bad guest address";
  758. goto fail_syntax;
  759. }
  760. err = qemu_strtoi(p, &end, 0, &guest_port);
  761. if (err || guest_port < 1 || guest_port > 65535) {
  762. fail_reason = "Bad guest port";
  763. goto fail_syntax;
  764. }
  765. guest_addr.sin_port = htons(guest_port);
  766. #if SLIRP_CHECK_VERSION(4, 5, 0)
  767. err = slirp_add_hostxfwd(s->slirp,
  768. (struct sockaddr *) &host_addr, sizeof(host_addr),
  769. (struct sockaddr *) &guest_addr, sizeof(guest_addr),
  770. is_udp ? SLIRP_HOSTFWD_UDP : 0);
  771. #else
  772. err = slirp_add_hostfwd(s->slirp, is_udp,
  773. host_addr.sin_addr, host_port,
  774. guest_addr.sin_addr, guest_port);
  775. #endif
  776. if (err < 0) {
  777. error_setg(errp, "Could not set up host forwarding rule '%s'",
  778. redir_str);
  779. return -1;
  780. }
  781. return 0;
  782. fail_syntax:
  783. error_setg(errp, "Invalid host forwarding rule '%s' (%s)", redir_str,
  784. fail_reason);
  785. return -1;
  786. }
  787. void hmp_hostfwd_add(Monitor *mon, const QDict *qdict)
  788. {
  789. const char *redir_str;
  790. SlirpState *s;
  791. const char *arg1 = qdict_get_str(qdict, "arg1");
  792. const char *arg2 = qdict_get_try_str(qdict, "arg2");
  793. if (arg2) {
  794. s = slirp_lookup(mon, arg1);
  795. redir_str = arg2;
  796. } else {
  797. s = slirp_lookup(mon, NULL);
  798. redir_str = arg1;
  799. }
  800. if (s) {
  801. Error *err = NULL;
  802. if (slirp_hostfwd(s, redir_str, &err) < 0) {
  803. error_report_err(err);
  804. }
  805. }
  806. }
  807. #if defined(CONFIG_SMBD_COMMAND)
  808. /* automatic user mode samba server configuration */
  809. static void slirp_smb_cleanup(SlirpState *s)
  810. {
  811. int ret;
  812. if (s->smb_dir) {
  813. gchar *cmd = g_strdup_printf("rm -rf %s", s->smb_dir);
  814. ret = system(cmd);
  815. if (ret == -1 || !WIFEXITED(ret)) {
  816. error_report("'%s' failed.", cmd);
  817. } else if (WEXITSTATUS(ret)) {
  818. error_report("'%s' failed. Error code: %d",
  819. cmd, WEXITSTATUS(ret));
  820. }
  821. g_free(cmd);
  822. g_free(s->smb_dir);
  823. s->smb_dir = NULL;
  824. }
  825. }
  826. static int slirp_smb(SlirpState* s, const char *exported_dir,
  827. struct in_addr vserver_addr, Error **errp)
  828. {
  829. char *smb_conf;
  830. char *smb_cmdline;
  831. struct passwd *passwd;
  832. FILE *f;
  833. passwd = getpwuid(geteuid());
  834. if (!passwd) {
  835. error_setg(errp, "Failed to retrieve user name");
  836. return -1;
  837. }
  838. if (access(CONFIG_SMBD_COMMAND, F_OK)) {
  839. error_setg(errp, "Could not find '%s', please install it",
  840. CONFIG_SMBD_COMMAND);
  841. return -1;
  842. }
  843. if (access(exported_dir, R_OK | X_OK)) {
  844. error_setg(errp, "Error accessing shared directory '%s': %s",
  845. exported_dir, strerror(errno));
  846. return -1;
  847. }
  848. s->smb_dir = g_dir_make_tmp("qemu-smb.XXXXXX", NULL);
  849. if (!s->smb_dir) {
  850. error_setg(errp, "Could not create samba server dir");
  851. return -1;
  852. }
  853. smb_conf = g_strdup_printf("%s/%s", s->smb_dir, "smb.conf");
  854. f = fopen(smb_conf, "w");
  855. if (!f) {
  856. slirp_smb_cleanup(s);
  857. error_setg(errp,
  858. "Could not create samba server configuration file '%s'",
  859. smb_conf);
  860. g_free(smb_conf);
  861. return -1;
  862. }
  863. fprintf(f,
  864. "[global]\n"
  865. "private dir=%s\n"
  866. "interfaces=127.0.0.1\n"
  867. "bind interfaces only=yes\n"
  868. "pid directory=%s\n"
  869. "lock directory=%s\n"
  870. "state directory=%s\n"
  871. "cache directory=%s\n"
  872. "ncalrpc dir=%s/ncalrpc\n"
  873. "log file=%s/log.smbd\n"
  874. "smb passwd file=%s/smbpasswd\n"
  875. "security = user\n"
  876. "map to guest = Bad User\n"
  877. "load printers = no\n"
  878. "printing = bsd\n"
  879. "disable spoolss = yes\n"
  880. "usershare max shares = 0\n"
  881. "[qemu]\n"
  882. "path=%s\n"
  883. "read only=no\n"
  884. "guest ok=yes\n"
  885. "force user=%s\n",
  886. s->smb_dir,
  887. s->smb_dir,
  888. s->smb_dir,
  889. s->smb_dir,
  890. s->smb_dir,
  891. s->smb_dir,
  892. s->smb_dir,
  893. s->smb_dir,
  894. exported_dir,
  895. passwd->pw_name
  896. );
  897. fclose(f);
  898. smb_cmdline = g_strdup_printf("%s -l %s -s %s",
  899. CONFIG_SMBD_COMMAND, s->smb_dir, smb_conf);
  900. g_free(smb_conf);
  901. if (slirp_add_exec(s->slirp, smb_cmdline, &vserver_addr, 139) < 0 ||
  902. slirp_add_exec(s->slirp, smb_cmdline, &vserver_addr, 445) < 0) {
  903. slirp_smb_cleanup(s);
  904. g_free(smb_cmdline);
  905. error_setg(errp, "Conflicting/invalid smbserver address");
  906. return -1;
  907. }
  908. g_free(smb_cmdline);
  909. return 0;
  910. }
  911. #endif /* defined(CONFIG_SMBD_COMMAND) */
  912. static int guestfwd_can_read(void *opaque)
  913. {
  914. struct GuestFwd *fwd = opaque;
  915. return slirp_socket_can_recv(fwd->slirp, fwd->server, fwd->port);
  916. }
  917. static void guestfwd_read(void *opaque, const uint8_t *buf, int size)
  918. {
  919. struct GuestFwd *fwd = opaque;
  920. slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size);
  921. }
  922. static ssize_t guestfwd_write(const void *buf, size_t len, void *chr)
  923. {
  924. return qemu_chr_fe_write_all(chr, buf, len);
  925. }
  926. static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
  927. {
  928. /* TODO: IPv6 */
  929. struct in_addr server = { .s_addr = 0 };
  930. struct GuestFwd *fwd;
  931. const char *p;
  932. char buf[128];
  933. char *end;
  934. int port;
  935. p = config_str;
  936. if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
  937. goto fail_syntax;
  938. }
  939. if (strcmp(buf, "tcp") && buf[0] != '\0') {
  940. goto fail_syntax;
  941. }
  942. if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
  943. goto fail_syntax;
  944. }
  945. if (buf[0] != '\0' && !inet_aton(buf, &server)) {
  946. goto fail_syntax;
  947. }
  948. if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
  949. goto fail_syntax;
  950. }
  951. port = strtol(buf, &end, 10);
  952. if (*end != '\0' || port < 1 || port > 65535) {
  953. goto fail_syntax;
  954. }
  955. snprintf(buf, sizeof(buf), "guestfwd.tcp.%d", port);
  956. if (g_str_has_prefix(p, "cmd:")) {
  957. if (slirp_add_exec(s->slirp, &p[4], &server, port) < 0) {
  958. error_setg(errp, "Conflicting/invalid host:port in guest "
  959. "forwarding rule '%s'", config_str);
  960. return -1;
  961. }
  962. } else {
  963. Error *err = NULL;
  964. /*
  965. * FIXME: sure we want to support implicit
  966. * muxed monitors here?
  967. */
  968. Chardev *chr = qemu_chr_new_mux_mon(buf, p, NULL);
  969. if (!chr) {
  970. error_setg(errp, "Could not open guest forwarding device '%s'",
  971. buf);
  972. return -1;
  973. }
  974. fwd = g_new(struct GuestFwd, 1);
  975. qemu_chr_fe_init(&fwd->hd, chr, &err);
  976. if (err) {
  977. error_propagate(errp, err);
  978. object_unparent(OBJECT(chr));
  979. g_free(fwd);
  980. return -1;
  981. }
  982. if (slirp_add_guestfwd(s->slirp, guestfwd_write, &fwd->hd,
  983. &server, port) < 0) {
  984. error_setg(errp, "Conflicting/invalid host:port in guest "
  985. "forwarding rule '%s'", config_str);
  986. qemu_chr_fe_deinit(&fwd->hd, true);
  987. g_free(fwd);
  988. return -1;
  989. }
  990. fwd->server = server;
  991. fwd->port = port;
  992. fwd->slirp = s->slirp;
  993. qemu_chr_fe_set_handlers(&fwd->hd, guestfwd_can_read, guestfwd_read,
  994. NULL, NULL, fwd, NULL, true);
  995. s->fwd = g_slist_append(s->fwd, fwd);
  996. }
  997. return 0;
  998. fail_syntax:
  999. error_setg(errp, "Invalid guest forwarding rule '%s'", config_str);
  1000. return -1;
  1001. }
  1002. void hmp_info_usernet(Monitor *mon, const QDict *qdict)
  1003. {
  1004. SlirpState *s;
  1005. QTAILQ_FOREACH(s, &slirp_stacks, entry) {
  1006. int id;
  1007. bool got_hub_id = net_hub_id_for_client(&s->nc, &id) == 0;
  1008. char *info = slirp_connection_info(s->slirp);
  1009. monitor_printf(mon, "Hub %d (%s):\n%s",
  1010. got_hub_id ? id : -1,
  1011. s->nc.name, info);
  1012. g_free(info);
  1013. }
  1014. }
  1015. static void
  1016. net_init_slirp_configs(const StringList *fwd, int flags)
  1017. {
  1018. while (fwd) {
  1019. struct slirp_config_str *config;
  1020. config = g_malloc0(sizeof(*config));
  1021. pstrcpy(config->str, sizeof(config->str), fwd->value->str);
  1022. config->flags = flags;
  1023. config->next = slirp_configs;
  1024. slirp_configs = config;
  1025. fwd = fwd->next;
  1026. }
  1027. }
  1028. static const char **slirp_dnssearch(const StringList *dnsname)
  1029. {
  1030. const StringList *c = dnsname;
  1031. size_t i = 0, num_opts = 0;
  1032. const char **ret;
  1033. while (c) {
  1034. num_opts++;
  1035. c = c->next;
  1036. }
  1037. if (num_opts == 0) {
  1038. return NULL;
  1039. }
  1040. ret = g_malloc((num_opts + 1) * sizeof(*ret));
  1041. c = dnsname;
  1042. while (c) {
  1043. ret[i++] = c->value->str;
  1044. c = c->next;
  1045. }
  1046. ret[i] = NULL;
  1047. return ret;
  1048. }
  1049. int net_init_slirp(const Netdev *netdev, const char *name,
  1050. NetClientState *peer, Error **errp)
  1051. {
  1052. struct slirp_config_str *config;
  1053. char *vnet;
  1054. int ret;
  1055. const NetdevUserOptions *user;
  1056. const char **dnssearch;
  1057. bool ipv4 = true, ipv6 = true;
  1058. assert(netdev->type == NET_CLIENT_DRIVER_USER);
  1059. user = &netdev->u.user;
  1060. if ((user->has_ipv6 && user->ipv6 && !user->has_ipv4) ||
  1061. (user->has_ipv4 && !user->ipv4)) {
  1062. ipv4 = 0;
  1063. }
  1064. if ((user->has_ipv4 && user->ipv4 && !user->has_ipv6) ||
  1065. (user->has_ipv6 && !user->ipv6)) {
  1066. ipv6 = 0;
  1067. }
  1068. vnet = user->net ? g_strdup(user->net) :
  1069. user->ip ? g_strdup_printf("%s/24", user->ip) :
  1070. NULL;
  1071. dnssearch = slirp_dnssearch(user->dnssearch);
  1072. /* all optional fields are initialized to "all bits zero" */
  1073. net_init_slirp_configs(user->hostfwd, SLIRP_CFG_HOSTFWD);
  1074. net_init_slirp_configs(user->guestfwd, 0);
  1075. ret = net_slirp_init(peer, "user", name, user->q_restrict,
  1076. ipv4, vnet, user->host,
  1077. ipv6, user->ipv6_prefix, user->ipv6_prefixlen,
  1078. user->ipv6_host, user->hostname, user->tftp,
  1079. user->bootfile, user->dhcpstart,
  1080. user->dns, user->ipv6_dns, user->smb,
  1081. user->smbserver, dnssearch, user->domainname,
  1082. user->tftp_server_name, errp);
  1083. while (slirp_configs) {
  1084. config = slirp_configs;
  1085. slirp_configs = config->next;
  1086. g_free(config);
  1087. }
  1088. g_free(vnet);
  1089. g_free(dnssearch);
  1090. return ret;
  1091. }