123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- From: Matthias Schiffer <mschiffer@universe-factory.net>
- Date: Sun, 6 Jul 2014 08:12:35 +0200
- Subject: dnsmasq: add patch to allow setting the default packet mark
- diff --git a/package/dnsmasq/patches/901-packet-mark.patch b/package/dnsmasq/patches/901-packet-mark.patch
- new file mode 100644
- index 0000000..286af3a
- --- /dev/null
- +++ b/package/dnsmasq/patches/901-packet-mark.patch
- @@ -0,0 +1,103 @@
- +--- a/src/dnsmasq.h
- ++++ b/src/dnsmasq.h
- +@@ -802,6 +802,7 @@ extern struct daemon {
- + int cachesize, ftabsize;
- + int port, query_port, min_port;
- + unsigned long local_ttl, neg_ttl, max_ttl, max_cache_ttl, auth_ttl;
- ++ unsigned int packet_mark;
- + struct hostsfile *addn_hosts;
- + struct dhcp_context *dhcp, *dhcp6;
- + struct dhcp_config *dhcp_conf;
- +--- a/src/forward.c
- ++++ b/src/forward.c
- +@@ -366,17 +366,17 @@ static int forward_query(int udpfd, unio
- + daemon->rfd_save = forward->rfd4;
- + fd = forward->rfd4->fd;
- + }
- ++ }
- ++
- ++ unsigned int mark = daemon->packet_mark;
- +
- + #ifdef HAVE_CONNTRACK
- +- /* Copy connection mark of incoming query to outgoing connection. */
- +- if (option_bool(OPT_CONNTRACK))
- +- {
- +- unsigned int mark;
- +- if (get_incoming_mark(udpaddr, dst_addr, 0, &mark))
- +- setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));
- +- }
- ++ /* Copy connection mark of incoming query to outgoing connection. */
- ++ if (option_bool(OPT_CONNTRACK))
- ++ get_incoming_mark(udpaddr, dst_addr, 0, &mark);
- + #endif
- +- }
- ++
- ++ setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));
- +
- + if (sendto(fd, (char *)header, plen, 0,
- + &start->addr.sa,
- +@@ -1001,11 +1001,11 @@ unsigned char *tcp_request(int confd, ti
- + continue;
- + }
- +
- ++ unsigned int mark = daemon->packet_mark;
- + #ifdef HAVE_CONNTRACK
- + /* Copy connection mark of incoming query to outgoing connection. */
- + if (option_bool(OPT_CONNTRACK))
- + {
- +- unsigned int mark;
- + struct all_addr local;
- + #ifdef HAVE_IPV6
- + if (local_addr->sa.sa_family == AF_INET6)
- +@@ -1014,10 +1014,11 @@ unsigned char *tcp_request(int confd, ti
- + #endif
- + local.addr.addr4 = local_addr->in.sin_addr;
- +
- +- if (get_incoming_mark(&peer_addr, &local, 1, &mark))
- +- setsockopt(last_server->tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));
- ++ get_incoming_mark(&peer_addr, &local, 1, &mark);
- + }
- + #endif
- ++
- ++ setsockopt(last_server->tcpfd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));
- + }
- +
- + c1 = size >> 8;
- +--- a/src/option.c
- ++++ b/src/option.c
- +@@ -131,6 +131,7 @@ struct myoption {
- + #ifdef OPTION6_PREFIX_CLASS
- + #define LOPT_PREF_CLSS 320
- + #endif
- ++#define LOPT_PACKET_MARK 9001
- +
- + #ifdef HAVE_GETOPT_LONG
- + static const struct option opts[] =
- +@@ -267,6 +268,7 @@ static const struct myoption opts[] =
- + #ifdef OPTION6_PREFIX_CLASS
- + { "dhcp-prefix-class", 1, 0, LOPT_PREF_CLSS },
- + #endif
- ++ { "packet-mark", 1, 0, LOPT_PACKET_MARK },
- + { NULL, 0, 0, 0 }
- + };
- +
- +@@ -409,6 +411,7 @@ static struct {
- + #ifdef OPTION6_PREFIX_CLASS
- + { LOPT_PREF_CLSS, ARG_DUP, "set:tag,<class>", gettext_noop("Specify DHCPv6 prefix class"), NULL },
- + #endif
- ++ { LOPT_PACKET_MARK, ARG_ONE, "<integer>", gettext_noop("Specify default packet mark for DNS queries."), NULL },
- + { 0, 0, NULL, NULL, NULL }
- + };
- +
- +@@ -2189,6 +2192,11 @@ static int one_opt(int option, char *arg
- + break;
- + }
- +
- ++ case LOPT_PACKET_MARK: /* --packet-mark */
- ++ if (!atoi_check(arg, (int*)&daemon->packet_mark))
- ++ ret_err(gen_err);
- ++ break;
- ++
- + #ifdef HAVE_DHCP
- + case 'X': /* --dhcp-lease-max */
- + if (!atoi_check(arg, &daemon->dhcp_max))
|