summaryrefslogtreecommitdiff
path: root/net/mpd5
diff options
context:
space:
mode:
Diffstat (limited to 'net/mpd5')
-rw-r--r--net/mpd5/Makefile2
-rw-r--r--net/mpd5/files/patch-l2tp-multihomed161
2 files changed, 162 insertions, 1 deletions
diff --git a/net/mpd5/Makefile b/net/mpd5/Makefile
index 206baa1d9059..9e4ed26ee476 100644
--- a/net/mpd5/Makefile
+++ b/net/mpd5/Makefile
@@ -2,7 +2,7 @@
PORTNAME= mpd
DISTVERSION= 5.9
-PORTREVISION= 4
+PORTREVISION= 6
CATEGORIES= net
MASTER_SITES= SF/${PORTNAME}/Mpd5/Mpd-${PORTVERSION}
PKGNAMESUFFIX= 5
diff --git a/net/mpd5/files/patch-l2tp-multihomed b/net/mpd5/files/patch-l2tp-multihomed
new file mode 100644
index 000000000000..33ec387c37c4
--- /dev/null
+++ b/net/mpd5/files/patch-l2tp-multihomed
@@ -0,0 +1,161 @@
+Index: src/util.c
+===================================================================
+--- src/util.c (revision 2436)
++++ src/util.c (working copy)
+@@ -16,8 +16,9 @@
+ #include <netdb.h>
+ #include <tcpd.h>
+ #include <sys/limits.h>
+-#include <sys/wait.h>
++#include <sys/socket.h>
+ #include <sys/sysctl.h>
++#include <sys/wait.h>
+ #include <net/route.h>
+ #include <netinet/if_ether.h>
+ #include <net/ethernet.h>
+@@ -1545,4 +1546,52 @@ IfaceSetFlag(const char *ifname, int value)
+ }
+ close(s);
+ return (0);
++}
++
++/*
++ * Obtain some data, peer (source) and destination addresses of SOCK_DGRAM IPv4 UDP request.
++ */
++ssize_t GetDataAddrs(int sock, void *dbuf, size_t dbufsize,
++ struct sockaddr_storage *peer, socklen_t peer_len,
++ struct u_addr *addr)
++{
++ struct {
++ struct msghdr msg;
++ struct iovec iov;
++ } b;
++ union { /* ensure correct alignment for space */
++ struct cmsghdr cm;
++ char space[CMSG_SPACE(sizeof(struct in_addr))];
++ } buf;
++
++ struct cmsghdr *p;
++ ssize_t size;
++
++ /* Sanity check */
++ if (addr->family != AF_INET) {
++ errno = EAFNOSUPPORT;
++ return (-1);
++ }
++
++ b.msg.msg_name = peer;
++ b.msg.msg_namelen = peer_len;
++ b.msg.msg_iov = &b.iov;
++ b.msg.msg_iovlen = 1;
++ b.msg.msg_control = &buf;
++ b.msg.msg_controllen = sizeof(buf);
++ b.msg.msg_flags = 0;
++
++ b.iov.iov_base = dbuf;
++ b.iov.iov_len = dbufsize;
++
++ if ((size = recvmsg(sock, &b.msg, 0)) < 0) {
++ Perror("%s: recvmsg: %s", __FUNCTION__, strerror(errno));
++ return (size);
++ }
++
++ p = CMSG_FIRSTHDR(&b.msg);
++ if (p && p->cmsg_level == IPPROTO_IP && p->cmsg_type == IP_RECVDSTADDR)
++ memcpy(&addr->u.ip4, CMSG_DATA(p), sizeof(addr->u.ip4));
++
++ return (size);
+ }
+Index: src/util.h
+===================================================================
+--- src/util.h (revision 2436)
++++ src/util.h (working copy)
+@@ -101,6 +101,10 @@ extern int GetPeerEther(struct u_addr *addr, struct so
+ extern void ppp_util_ascify(char *buf, size_t max, const char *bytes, size_t len);
+ extern int IfaceSetFlag(const char *ifname, int value);
+
++ssize_t GetDataAddrs(int sock, void *dbuf, size_t dbufsize,
++ struct sockaddr_storage *peer, socklen_t peer_len,
++ struct u_addr *addr);
++
+ #ifndef HAVE_NTOA_R
+ extern char *ether_ntoa_r(const struct ether_addr *n, char *a);
+ #endif
+Index: src/l2tp.c
+===================================================================
+--- src/l2tp.c (revision 2436)
++++ src/l2tp.c (working copy)
+@@ -1374,6 +1374,7 @@ L2tpServerEvent(int type, void *arg)
+ struct ngm_mkpeer mkpeer;
+ struct sockaddr_storage peer_sas;
+ struct sockaddr_storage sas;
++ struct u_addr server_addr;
+ const size_t bufsize = 8192;
+ u_int16_t *buf = NULL;
+ char hook[NG_HOOKSIZ];
+@@ -1393,9 +1394,18 @@ L2tpServerEvent(int type, void *arg)
+ /* Allocate buffer */
+ buf = Malloc(MB_PHYS, bufsize);
+
++ u_addrcopy(&s->self_addr, &server_addr);
++
+ /* Read packet */
+ sas_len = sizeof(peer_sas);
+- if ((len = recvfrom(s->sock, buf, bufsize, 0,
++
++ if (u_addrempty(&s->self_addr)) {
++ if ((len = GetDataAddrs(s->sock, buf, bufsize,
++ &peer_sas, sas_len, &server_addr)) == -1) {
++ Perror("L2TP: GetDataAddrs");
++ goto fail;
++ }
++ } else if ((len = recvfrom(s->sock, buf, bufsize, 0,
+ (struct sockaddr *)&peer_sas, &sas_len)) == -1) {
+ Perror("L2TP: recvfrom");
+ goto fail;
+@@ -1415,9 +1425,23 @@ L2tpServerEvent(int type, void *arg)
+ tun->self_port = s->self_port;
+ tun->alive = 1;
+
+- Log(LG_PHYS, ("Incoming L2TP packet from %s %d",
+- u_addrtoa(&tun->peer_addr, namebuf, sizeof(namebuf)), tun->peer_port));
++ if (u_addrempty(&tun->self_addr))
++ u_addrcopy(&server_addr, &tun->self_addr);
+
++ if (u_addrempty(&tun->self_addr))
++ Log(LG_PHYS, ("Incoming L2TP packet from %s %d",
++ u_addrtoa(&tun->peer_addr, namebuf, sizeof(namebuf)),
++ tun->peer_port));
++ else {
++ char buf3[INET_ADDRSTRLEN];
++
++ Log(LG_PHYS, ("Incoming L2TP packet from %s %d to %s %d",
++ u_addrtoa(&tun->peer_addr, namebuf, sizeof(namebuf)),
++ tun->peer_port,
++ u_addrtoa(&tun->self_addr, buf3, sizeof(buf3)),
++ tun->self_port));
++ }
++
+ /* Examine all L2TP links to get best possible fit tunnel parameters. */
+ for (k = 0; k < gNumLinks; k++) {
+ Link l2;
+@@ -1552,7 +1576,7 @@ L2tpServerEvent(int type, void *arg)
+ }
+
+ /* Bind socket to a new port */
+- u_addrtosockaddr(&s->self_addr,s->self_port,&sas);
++ u_addrtosockaddr(&tun->self_addr,tun->self_port,&sas);
+ if (NgSendMsg(csock, namebuf, NGM_KSOCKET_COOKIE,
+ NGM_KSOCKET_BIND, &sas, sas.ss_len) == -1) {
+ Perror("L2TP: bind");
+@@ -1649,6 +1673,10 @@ L2tpListen(Link l)
+ SO_REUSEPORT, &one, sizeof(one)) == -1) {
+ Perror("L2TP: setsockopt");
+ goto fail;
++ }
++ if (u_addrempty(&s->self_addr)) {
++ int on = 1;
++ setsockopt(s->sock, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on));
+ }
+ u_addrtosockaddr(&s->self_addr, s->self_port, &sa);
+ if (bind(s->sock, (struct sockaddr *)&sa, sa.ss_len) == -1) {