diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..64c227e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/mptcpd-0.8.tar.gz diff --git a/.mptcpd.metadata b/.mptcpd.metadata new file mode 100644 index 0000000..9a3e9db --- /dev/null +++ b/.mptcpd.metadata @@ -0,0 +1 @@ +a75235d98b7d2ab1ed71e0bd9d1683e6da462bfb SOURCES/mptcpd-0.8.tar.gz diff --git a/SOURCES/0001-mptcpize-force-MPTCP-usage-for-IPPROTO_IP-too-159.patch b/SOURCES/0001-mptcpize-force-MPTCP-usage-for-IPPROTO_IP-too-159.patch new file mode 100644 index 0000000..4db092b --- /dev/null +++ b/SOURCES/0001-mptcpize-force-MPTCP-usage-for-IPPROTO_IP-too-159.patch @@ -0,0 +1,31 @@ +From 5633f08e35552295b2f9414ff32ca4e8e081b2f2 Mon Sep 17 00:00:00 2001 +Message-Id: <5633f08e35552295b2f9414ff32ca4e8e081b2f2.1638196305.git.dcaratti@redhat.com> +From: Paolo Abeni +Date: Tue, 12 Oct 2021 19:24:33 +0200 +Subject: [PATCH] mptcpize: force MPTCP usage for IPPROTO_IP, too (#159) + +The current ignores calls alike: + + socket(AF_INET, SOCK_STREAM, IPPROTO_IP) + +We should hijack them, too. +--- + src/mptcpwrap.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/mptcpwrap.c b/src/mptcpwrap.c +index 37b0545..1aaf00f 100644 +--- a/src/mptcpwrap.c ++++ b/src/mptcpwrap.c +@@ -27,7 +27,7 @@ int __attribute__((visibility("default"))) socket(int family, int type, int prot + goto do_socket; + + // socket(AF_INET, SOCK_STREM, 0) maps to TCP, too +- if (protocol == 0 && protocol != IPPROTO_TCP) ++ if (protocol != 0 && protocol != IPPROTO_TCP) + goto do_socket; + + protocol = IPPROTO_TCP + 256; +-- +2.31.1 + diff --git a/SOURCES/0001-mptcpize-use-explicit-file-copy-instead-of-rename-16.patch b/SOURCES/0001-mptcpize-use-explicit-file-copy-instead-of-rename-16.patch new file mode 100644 index 0000000..f8a0347 --- /dev/null +++ b/SOURCES/0001-mptcpize-use-explicit-file-copy-instead-of-rename-16.patch @@ -0,0 +1,75 @@ +From 591b3b168d949c45d5b5994332a3007767845434 Mon Sep 17 00:00:00 2001 +Message-Id: <591b3b168d949c45d5b5994332a3007767845434.1638277575.git.dcaratti@redhat.com> +From: Paolo Abeni +Date: Thu, 14 Oct 2021 05:05:54 +0200 +Subject: [PATCH] mptcpize: use explicit file copy instead of rename() (#161) + +The mentioned syscall fails if the involved files belong to +different fs, which is pretty much expected in the relevant +scenario (tmp file, in tmpfs, and unit file usually under the +root partition) + +Instead use sendfile() to explicitly copy all the contents. Note +that we need to close and re-open the unit file, as sendfile() +expect a O_WRITE fd as the target. +--- + src/mptcpize.c | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +diff --git a/src/mptcpize.c b/src/mptcpize.c +index cb79e09..b502d75 100644 +--- a/src/mptcpize.c ++++ b/src/mptcpize.c +@@ -13,6 +13,7 @@ + + #include + #include ++#include + + #include + #include +@@ -163,10 +164,12 @@ static int unit_update(int argc, char *argv[], int enable) + char *unit, *line = NULL; + int append_env = enable; + char dst_path[PATH_MAX]; ++ off_t bytes_copied = 0; ++ struct stat fileinfo; ++ int dst, unit_fd; + size_t len = 0; + ssize_t read; + FILE *src; +- int dst; + + if (argc < 1) { + fprintf(stderr, "missing unit argument\n"); +@@ -210,11 +213,24 @@ static int unit_update(int argc, char *argv[], int enable) + error(1, errno, "can't read from %s", unit); + free(line); + fclose(src); +- close(dst); + +- if (rename(dst_path, unit) < 0) +- error(1, errno, "can't rename %s to %s", dst_path, unit); ++ // copy back the modified file into the original unit ++ // note: avoid using rename, as it fails across filesystems ++ if (fstat(dst, &fileinfo) < 0) ++ error(1, errno, "can't stat %s", dst_path); ++ ++ // re-open the unit file for writing ++ // mkstemp already opened the temporary file for R/W so we don't need ++ // to touch that file descriptor. ++ unit_fd = open(unit, O_TRUNC | O_RDWR); ++ if (unit_fd < 0) ++ error(1, errno, "can't open %s for writing", unit); + ++ while (bytes_copied < fileinfo.st_size) ++ if (sendfile(unit_fd, dst, &bytes_copied, fileinfo.st_size - bytes_copied) < 0) ++ error(1, errno, "can't copy from %s to %s", dst_path, unit); ++ ++ close(dst); + if (system("systemctl daemon-reload") != 0) + error(1, errno, "can't reload unit, manual 'systemctl daemon-reload' is required"); + +-- +2.31.1 + diff --git a/SOURCES/0003-fix-multilib-install.patch b/SOURCES/0003-fix-multilib-install.patch new file mode 100644 index 0000000..6915d9a --- /dev/null +++ b/SOURCES/0003-fix-multilib-install.patch @@ -0,0 +1,24 @@ +diff --git a/etc/mptcpd.conf.in b/etc/mptcpd.conf.in +index 615c63b..c6b31ac 100644 +--- a/etc/mptcpd.conf.in ++++ b/etc/mptcpd.conf.in +@@ -19,7 +19,6 @@ log=@mptcpd_logger@ + # ---------------- + # Plugin directory + # ---------------- +-plugin-dir=@pkglibdir@ + + # ------------------- + # Path manager plugin +diff --git a/src/mptcp.service.in b/src/mptcp.service.in +index 89dfe04..738f59f 100644 +--- a/src/mptcp.service.in ++++ b/src/mptcp.service.in +@@ -9,7 +9,6 @@ Documentation=man:mptcpd(8) + [Service] + Type=simple + DynamicUser=yes +-Environment=LD_LIBRARY_PATH=@libdir@ + ExecStart=@libexecdir@/mptcpd --log=journal + CapabilityBoundingSet=CAP_NET_ADMIN + AmbientCapabilities=CAP_NET_ADMIN diff --git a/SPECS/mptcpd.spec b/SPECS/mptcpd.spec new file mode 100644 index 0000000..c44fe03 --- /dev/null +++ b/SPECS/mptcpd.spec @@ -0,0 +1,121 @@ +Summary: Multipath TCP daemon +Name: mptcpd +Version: 0.8 +Release: 2%{?dist} +License: BSD +URL: https://multipath-tcp.org +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd +BuildRequires: make +BuildRequires: gcc +BuildRequires: libtool +BuildRequires: automake +BuildRequires: autoconf +BuildRequires: autoconf-archive +BuildRequires: libell-devel +BuildRequires: systemd-units +BuildRequires: systemd-rpm-macros + +Source0: https://github.com/intel/mptcpd/archive/v%{version}/%{name}-%{version}.tar.gz + +Patch3: 0003-fix-multilib-install.patch +Patch4: 0001-mptcpize-force-MPTCP-usage-for-IPPROTO_IP-too-159.patch +Patch5: 0001-mptcpize-use-explicit-file-copy-instead-of-rename-16.patch + +%description +The Multipath TCP Daemon is a daemon for Linux based operating systems that +performs multipath TCP path management related operations in user space. It +interacts with the Linux kernel through a generic netlink connection to track +per-connection information (e.g. available remote addresses), available network +interfaces, request new MPTCP subflows, handle requests for subflows, etc. + +%package devel +Summary: MPTCP path manager header files +Group: Development/Libraries +Requires: pkgconfig +Requires: %{name}%{?_isa} = %{version}-%{release} +License: BSD + +%description devel +Header files for adding MPTCP path manager support to applications + +%prep +%autosetup -p1 + +%build +autoreconf --install --symlink --force +%configure --enable-debug=info +%make_build V=1 + +%install +install -d %{buildroot}/%{_libexecdir} +install -d %{buildroot}/%{_mandir}/man8 +install -d %{buildroot}/%{_sysconfdir}/%{name} +install -d %{buildroot}/%{_unitdir} +install -d %{buildroot}/%{_libdir}/%{name} +install -d %{buildroot}/%{_includedir}/%{name} +%make_install +sed -i '/^# addr-flags=subflow/s/^# //g' %{buildroot}/%{_sysconfdir}/%{name}/%{name}.conf +sed -i '/^# notify-flags=existing,skip_link_local,skip_loopback/s/^# //g' %{buildroot}/%{_sysconfdir}/%{name}/%{name}.conf +find %{buildroot} -name '*.la' -exec rm -f {} ';' + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig +%systemd_postun mptcp.service + +%files +%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf +%dir %{_sysconfdir}/%{name} +%dir %{_libdir}/%{name} +%{_libdir}/libmptcpd.so.* +%{_libdir}/%{name}/*.so +%{_libdir}/%{name}/libmptcpwrap.so* +%{_libexecdir}/%{name} +%{_bindir}/mptcpize +%{_unitdir}/mptcp.service +%{_mandir}/man8/%{name}.8.gz +%{_mandir}/man8/mptcpize.8.gz +# todo add %doc +%license COPYING + +%files devel +%doc COPYING +%dir %{_includedir}/%{name} +%{_libdir}/*.so +%{_includedir}/mptcpd/*.h +%{_libdir}/pkgconfig/mptcpd.pc + +%changelog +* Tue Nov 30 2021 Davide Caratti - 0.8-2 +- fix mptcpize to work also when protocol number is 0 (upstream issue #159) + and when command resides in another file system (upstream issue #161) + Related: rhbz#2015623 + +* Wed Sep 29 2021 Davide Caratti - 0.8-1 +- update to version 0.8 + +* Mon Aug 09 2021 Mohan Boddu - 0.7-3 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Wed Jun 23 2021 Davide Caratti - 0.7-2 +- add a simple sanity test and enable gating. Related: rhbz#1962741 +- don't overwrite global build options. Related: rhbz#1967697 +- fix 'check_conflicts' on multilib. Related: rhbz#1967697 + +* Wed Apr 28 2021 Davide Caratti - 0.7-1 +- update to version 0.7 + +* Fri Apr 16 2021 Mohan Boddu - 0.6-2 +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Wed Mar 17 2021 Davide Caratti - 0.6-1 +- update to version 0.6 + +* Tue Jan 26 2021 Fedora Release Engineering - 0.5.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Jan 20 2021 Davide Caratti - 0.5.1-1 +- initial build