2
0

slirp.c 33 KB

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