Skip to content

Commit ed51817

Browse files
authored
Merge pull request #127 from AkihiroSuda/revendor-libslirp-20190801
revendor libslirp
2 parents aacef69 + 4f98340 commit ed51817

12 files changed

+57
-701
lines changed

slirp4netns.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ Slirp *create_slirp(void *opaque, struct slirp4netns_config *s4nn)
252252
Slirp *slirp = NULL;
253253
SlirpConfig cfg;
254254
memset(&cfg, 0, sizeof(cfg));
255+
cfg.version = 1;
255256
cfg.restricted = 0;
256257
cfg.in_enabled = 1;
257258
cfg.vnetwork = s4nn->vnetwork;
@@ -273,9 +274,9 @@ Slirp *create_slirp(void *opaque, struct slirp4netns_config *s4nn)
273274
cfg.if_mtu = s4nn->mtu;
274275
cfg.if_mru = s4nn->mtu;
275276
cfg.disable_host_loopback = s4nn->disable_host_loopback;
276-
slirp = slirp_initx(&cfg, &libslirp_cb, opaque);
277+
slirp = slirp_new(&cfg, &libslirp_cb, opaque);
277278
if (slirp == NULL) {
278-
fprintf(stderr, "slirp_initx failed\n");
279+
fprintf(stderr, "slirp_new failed\n");
279280
}
280281
return slirp;
281282
}

vendor.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Vendor
22

3-
The `*.patch` files in `vendor_patches` directory are applied to `vendor` via [`vendor.sh`](./vendor.sh).
3+
The `*.patch` files in `vendor_patches` directory (if exists) are applied to `vendor` via [`vendor.sh`](./vendor.sh).
44
Please DO NOT edit files under `vendor`.
55

66
## Update vendor

vendor.sh

+16-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash
22
set -eux -o pipefail
3-
# May 24, 2019
4-
LIBSLIRP_COMMIT=113a219a69adc730ffa860c3f432049f8aa8f714
3+
# Aug 1, 2019
4+
LIBSLIRP_COMMIT=30804efc8f80f43d415057f3099c2894b0f947c4
55
LIBSLIRP_REPO=https://gitlab.freedesktop.org/slirp/libslirp.git
66

77
# Jul 12, 2019
@@ -20,7 +20,9 @@ git clone $LIBSLIRP_REPO $tmp_git/libslirp
2020
(
2121
cd $tmp_git/libslirp
2222
git checkout $LIBSLIRP_COMMIT
23-
git am $slirp4netns_root/vendor_patches/libslirp/*.patch
23+
if ls $slirp4netns_root/vendor_patches/libslirp/*.patch >/dev/null; then
24+
git am $slirp4netns_root/vendor_patches/libslirp/*.patch
25+
fi
2426
# run make to generate src/libslirp-version.h
2527
make
2628
mkdir -p $tmp_vendor/libslirp/src
@@ -45,14 +47,22 @@ Vendored components:
4547
* libslirp: $LIBSLIRP_REPO (\`$LIBSLIRP_COMMIT\`)
4648
* parson: $PARSON_REPO (\`$PARSON_COMMIT\`)
4749
50+
EOF
51+
52+
if ls $slirp4netns_root/vendor_patches/libslirp/*.patch >/dev/null; then
53+
cat <<EOF >>$tmp_vendor/README.md
4854
Applied patches (sha256sum):
4955
\`\`\`
5056
$(
51-
cd $slirp4netns_root
52-
sha256sum vendor_patches/*/*
53-
)
57+
cd $slirp4netns_root
58+
sha256sum vendor_patches/*/*
59+
)
5460
\`\`\`
5561
62+
EOF
63+
fi
64+
65+
cat <<EOF >>$tmp_vendor/README.md
5666
Please do not edit the contents under this directory manually.
5767
5868
See also [\`../vendor.md\`](../vendor.md).

vendor/README.md

+1-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
# DO NOT EDIT MANUALLY
22

33
Vendored components:
4-
* libslirp: https://gitlab.freedesktop.org/slirp/libslirp.git (`113a219a69adc730ffa860c3f432049f8aa8f714`)
4+
* libslirp: https://gitlab.freedesktop.org/slirp/libslirp.git (`30804efc8f80f43d415057f3099c2894b0f947c4`)
55
* parson: https://github.com/kgabis/parson.git (`c5bb9557fe98367aa8e041c65863909f12ee76b2`)
66

7-
Applied patches (sha256sum):
8-
```
9-
c8a0602500e5a3c7687f2af5d9d329591d655483505c192b0a656913dcc4e7ee vendor_patches/libslirp/0001-add-slirp_initx-SlirpConfig-SlirpCb-void.patch
10-
495a0604f3cd3e8463f127b634215ac25d311204756d4ce4079ae81b6fb87cbe vendor_patches/libslirp/0002-allow-custom-MTU.patch
11-
9cd83f55d0696d898bc8f8c48df04f8dd97576511780b36bf92f439dcb33b33c vendor_patches/libslirp/0003-add-disable_host_loopback-prohibit-connections-to-12.patch
12-
```
13-
147
Please do not edit the contents under this directory manually.
158

169
See also [`../vendor.md`](../vendor.md).

vendor/libslirp/src/if.h

+2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
#define IF_NOCIDCOMP 0x08 /* CID compression */
1313

1414
#define IF_MTU_DEFAULT 1500
15+
#define IF_MTU_MIN 68
1516
#define IF_MTU_MAX 65521
1617
#define IF_MRU_DEFAULT 1500
18+
#define IF_MRU_MIN 68
1719
#define IF_MRU_MAX 65521
1820
#define IF_COMP IF_AUTOCOMP /* Flags for compression */
1921

vendor/libslirp/src/ip_input.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp)
326326
q = fp->frag_link.next;
327327
m = dtom(slirp, q);
328328

329+
int was_ext = m->m_flags & M_EXT;
330+
329331
q = (struct ipasfrag *)q->ipf_next;
330332
while (q != (struct ipasfrag *)&fp->frag_link) {
331333
struct mbuf *t = dtom(slirp, q);
@@ -348,7 +350,7 @@ static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp)
348350
* the old buffer (in the mbuf), so we must point ip
349351
* into the new buffer.
350352
*/
351-
if (m->m_flags & M_EXT) {
353+
if (!was_ext && m->m_flags & M_EXT) {
352354
int delta = (char *)q - m->m_dat;
353355
q = (struct ipasfrag *)(m->m_ext + delta);
354356
}

vendor/libslirp/src/libslirp.h

+16-5
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,15 @@ typedef struct SlirpCb {
6666
void (*notify)(void *opaque);
6767
} SlirpCb;
6868

69+
#define SLIRP_CONFIG_VERSION_MIN 1
70+
#define SLIRP_CONFIG_VERSION_MAX 1
71+
6972
typedef struct SlirpConfig {
73+
/* Version must be already provided */
74+
uint32_t version;
75+
/*
76+
* Fields introduced in SlirpConfig version 1 begin
77+
*/
7078
int restricted;
7179
bool in_enabled;
7280
struct in_addr vnetwork;
@@ -86,16 +94,19 @@ typedef struct SlirpConfig {
8694
const char **vdnssearch;
8795
const char *vdomainname;
8896
/* Default: IF_MTU_DEFAULT */
89-
int if_mtu;
97+
size_t if_mtu;
9098
/* Default: IF_MRU_DEFAULT */
91-
int if_mru;
99+
size_t if_mru;
92100
/* Prohibit connecting to 127.0.0.1:* */
93101
bool disable_host_loopback;
102+
/*
103+
* Fields introduced in SlirpConfig version 2 begin
104+
*/
94105
} SlirpConfig;
95106

96-
Slirp *slirp_initx(const SlirpConfig *cfg, const SlirpCb *callbacks,
97-
void *opaque);
98-
/* slirp_init is deprecated in favor of slirp_initx */
107+
Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks,
108+
void *opaque);
109+
/* slirp_init is deprecated in favor of slirp_new */
99110
Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
100111
struct in_addr vnetmask, struct in_addr vhost,
101112
bool in6_enabled, struct in6_addr vprefix_addr6,

vendor/libslirp/src/slirp.c

+11-13
Original file line numberDiff line numberDiff line change
@@ -267,19 +267,17 @@ static void slirp_init_once(void)
267267
}
268268
}
269269

270-
Slirp *slirp_initx(const SlirpConfig *cfg, const SlirpCb *callbacks,
271-
void *opaque)
270+
Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque)
272271
{
273272
Slirp *slirp;
274-
if (cfg == NULL) {
275-
return NULL;
276-
}
277-
if (cfg->if_mtu > IF_MTU_MAX) {
278-
return NULL;
279-
}
280-
if (cfg->if_mru > IF_MRU_MAX) {
281-
return NULL;
282-
}
273+
274+
g_return_val_if_fail(cfg != NULL, NULL);
275+
g_return_val_if_fail(cfg->version >= SLIRP_CONFIG_VERSION_MIN, NULL);
276+
g_return_val_if_fail(cfg->version <= SLIRP_CONFIG_VERSION_MAX, NULL);
277+
g_return_val_if_fail(cfg->if_mtu >= IF_MTU_MIN || cfg->if_mtu == 0, NULL);
278+
g_return_val_if_fail(cfg->if_mtu <= IF_MTU_MAX, NULL);
279+
g_return_val_if_fail(cfg->if_mru >= IF_MRU_MIN || cfg->if_mru == 0, NULL);
280+
g_return_val_if_fail(cfg->if_mru <= IF_MRU_MAX, NULL);
283281

284282
slirp = g_malloc0(sizeof(Slirp));
285283

@@ -297,7 +295,6 @@ Slirp *slirp_initx(const SlirpConfig *cfg, const SlirpCb *callbacks,
297295
ip_init(slirp);
298296
ip6_init(slirp);
299297

300-
/* Initialise mbufs *after* setting the MTU */
301298
m_init(slirp);
302299

303300
slirp->vnetwork_addr = cfg->vnetwork;
@@ -341,6 +338,7 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
341338
{
342339
SlirpConfig cfg;
343340
memset(&cfg, 0, sizeof(cfg));
341+
cfg.version = 1;
344342
cfg.restricted = restricted;
345343
cfg.in_enabled = in_enabled;
346344
cfg.vnetwork = vnetwork;
@@ -359,7 +357,7 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
359357
cfg.vnameserver6 = vnameserver6;
360358
cfg.vdnssearch = vdnssearch;
361359
cfg.vdomainname = vdomainname;
362-
return slirp_initx(&cfg, callbacks, opaque);
360+
return slirp_new(&cfg, callbacks, opaque);
363361
}
364362

365363
void slirp_cleanup(Slirp *slirp)

vendor/libslirp/src/tcp_subr.c

+4
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,10 @@ struct tcpcb *tcp_newtcpcb(struct socket *so)
261261

262262
memset((char *)tp, 0, sizeof(struct tcpcb));
263263
tp->seg_next = tp->seg_prev = (struct tcpiphdr *)tp;
264+
/*
265+
* 40: length of IPv4 header (20) + TCP header (20)
266+
* 60: length of IPv6 header (40) + TCP header (20)
267+
*/
264268
tp->t_maxseg =
265269
MIN(so->slirp->if_mtu - ((so->so_ffamily == AF_INET) ? 40 : 60),
266270
TCP_MAXSEG_MAX);

0 commit comments

Comments
 (0)