diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-05-17 14:21:36 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-05-17 14:21:36 +0000 |
commit | 80ea9ca8d890d959ac9816f60ab4da6a68f2debe (patch) | |
tree | 04d7416329711869ba9b8168baa5c81664e34e92 | |
parent | 82519d70ba066ba43452f7562155d17287b6c4c9 (diff) | |
parent | 337e7e3a369dd09e37ddf2df37d4fb03f92db49f (diff) | |
download | dnsmasq-80ea9ca8d890d959ac9816f60ab4da6a68f2debe.tar.gz |
release-request-323db86e-b638-4d24-8eb1-d2e3bf4a9d1a-for-git_oc-mr1-release-4017779 snap-temp-L47900000064949209
Change-Id: I90f2ca1997668fb9b6c5f12aa80abc681a4580ee
-rwxr-xr-x | src/dhcp.c | 5 | ||||
-rwxr-xr-x | src/dnsmasq.h | 1 | ||||
-rwxr-xr-x | src/network.c | 23 | ||||
-rwxr-xr-x | src/option.c | 18 |
4 files changed, 47 insertions, 0 deletions
@@ -76,6 +76,11 @@ void dhcp_init(void) if (bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in))) die(_("failed to bind DHCP server socket: %s"), NULL, EC_BADNET); +#ifdef __ANDROID__ + if (setsockopt(fd, SOL_SOCKET, SO_MARK, &daemon->listen_mark, sizeof(daemon->listen_mark)) == -1) + die(_("failed to set DHCP socket mark: %s"), NULL, EC_BADNET); +#endif /* __ANDROID__ */ + daemon->dhcpfd = fd; #if defined(HAVE_BSD_NETWORK) diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 2887546..10b8521 100755 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -644,6 +644,7 @@ extern struct daemon { struct doctor *doctors; unsigned short edns_pktsz; char *tftp_prefix; + uint32_t listen_mark; /* globally used stuff for DNS */ char *packet; /* packet buffer */ diff --git a/src/network.c b/src/network.c index f2c3073..1588288 100755 --- a/src/network.c +++ b/src/network.c @@ -369,7 +369,24 @@ struct listener *create_wildcard_listeners(void) #endif bind(fd, (struct sockaddr *)&addr, sa_len(&addr)) == -1) return NULL; + +#ifdef __ANDROID__ + uint32_t mark = daemon->listen_mark; + if (mark != 0 && + (setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1 || + setsockopt(tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1 || + setsockopt(l6->fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1 || + setsockopt(l6->tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1)) + { + my_syslog(LOG_WARNING, _("setsockopt(SO_MARK, 0x%x: %s"), mark, strerror(errno)); + close(fd); + close(tcpfd); + close(l6->fd); + close(l6->tcpfd); + return NULL; + } } +#endif /* __ANDROID__ */ #ifdef HAVE_TFTP if (daemon->options & OPT_TFTP) @@ -476,6 +493,12 @@ void create_bound_listener(struct listener **listeners, struct irec *iface) die(_("failed to bind listening socket for %s: %s"), daemon->namebuff, EC_BADNET); } + uint32_t mark = daemon->listen_mark; + if (mark != 0 && + (setsockopt(new->fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1 || + setsockopt(new->tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) == -1)) + die(_("failed to set SO_MARK on listen socket: %s"), NULL, EC_BADNET); + if (listen(new->tcpfd, 5) == -1) die(_("failed to listen on socket: %s"), NULL, EC_BADNET); } diff --git a/src/option.c b/src/option.c index 9e7ac2f..8d5a39e 100755 --- a/src/option.c +++ b/src/option.c @@ -102,6 +102,7 @@ struct myoption { #define LOPT_PXE_PROMT 291 #define LOPT_PXE_SERV 292 #define LOPT_TEST 293 +#define LOPT_LISTNMARK 294 #ifdef HAVE_GETOPT_LONG static const struct option opts[] = @@ -208,6 +209,9 @@ static const struct myoption opts[] = { "cname", 1, 0, LOPT_CNAME }, { "pxe-prompt", 1, 0, LOPT_PXE_PROMT }, { "pxe-service", 1, 0, LOPT_PXE_SERV }, +#ifdef __ANDROID__ + { "listen-mark", 1, 0, LOPT_LISTNMARK }, +#endif /* __ANDROID__ */ { "test", 0, 0, LOPT_TEST }, { NULL, 0, 0, 0 } }; @@ -322,6 +326,7 @@ static struct { { LOPT_CNAME, ARG_DUP, "<alias>,<target>", gettext_noop("Specify alias name for LOCAL DNS name."), NULL }, { LOPT_PXE_PROMT, ARG_DUP, "<prompt>,[<timeout>]", gettext_noop("Prompt to send to PXE clients."), NULL }, { LOPT_PXE_SERV, ARG_DUP, "<service>", gettext_noop("Boot service for PXE menu."), NULL }, + { LOPT_LISTNMARK, ARG_ONE, NULL, gettext_noop("Socket mark to use for listen sockets."), NULL }, { LOPT_TEST, 0, NULL, gettext_noop("Check configuration syntax."), NULL }, { 0, 0, NULL, NULL, NULL } }; @@ -2497,6 +2502,19 @@ static char *one_opt(int option, char *arg, char *gen_prob, int nest) break; } + case LOPT_LISTNMARK: /* --listen-mark */ + { + char *endptr; + uint32_t mark = strtoul(arg, &endptr, 0); +my_syslog(LOG_WARNING, "passed-in mark: %s", arg); + if (!*endptr) + daemon->listen_mark = mark; + else + problem = _("invalid mark"); +my_syslog(LOG_WARNING, "daemon->listen_mark: 0x%x, *endptr=%d", daemon->listen_mark, *endptr); + break; + } + default: return _("unsupported option (check that dnsmasq was compiled with DHCP/TFTP/DBus support)"); |