multipath-tcp / mptcpd

mptcpd is a daemon for Linux that performs Multipath TCP path management related operations in the user space 😈
https://mptcpd.mptcp.dev/
BSD 3-Clause "New" or "Revised" License
169 stars 36 forks source link

Unable to run ./mptcpd (error: symbol lookup error) #266

Open abhinaba-fbr opened 1 year ago

abhinaba-fbr commented 1 year ago

Hello

I have installed mptcpd 0.11 as per the instructions provided in github. Once installed I m trying to run the binary of mptcpd present in /usr/local/libexec/ . However I encountered an error which mentions ./mptcpd: symbol lookup error: ./mptcpd: undefined symbol: mptcpd_lm_destroy. Is there any other configuration that I need to make sure before running the binary. Or is it an issue that needs to be fixed in mptcpd 0.11?

Thanks in advance

ossama-othman commented 1 year ago

It looks like you're running mptcpd directly from the command line in the /usr/local/libexec directory, i.e.:

$ cd /usr/local/libexec
# ./mptcpd

Is that correct? If so, you'll need to make sure the library search path LD_LIBRARY_PATH environment variable includes /usr/local/lib since that directory is typically not searched by default. For example, something like the following should work:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib ./mptcpd

This is basically what the mptcpd systemd unit file does. In mptcp.service:

.,..
[Service]
Type=simple
DynamicUser=yes
Environment=LD_LIBRARY_PATH=/usr/local/lib
ExecStart=/usr/local/libexec/mptcpd --log=journal
...

HTH!

abhinaba-fbr commented 1 year ago

Hello @ossama-othman

Thanks for your reply. It helped me in starting the mptcp daemon.

However, I m actually trying to emulate a very simple experiment using mptcpd. Where I created this topology - Basic-topology drawio

I started the mptcp daemon in both the machines, with default settings (i.e sspi plugin is loaded).

However I receive the following output on running iperf3 - On the server side -

root@abhinaba-VivoBook:~# LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib /usr/local/libexec/mptcpd -d
configuration.c:mptcpd_config_create() path manager plugin directory: /usr/local/lib/mptcpd
configuration.c:mptcpd_config_create() default path manager plugin: sspi
path_manager.c:family_appeared() "mptcp_pm" generic netlink family appeared
MPTCP address advertiser path manager initialized.
MPTCP single-subflow-per-interface path manager initialized.
No network interface with given IP address.
Unable to track new connection
sspi_connection_established is unimplemented.
No network interface with given IP address.
Unable to track new connection
sspi_connection_established is unimplemented.
Untracked connection closed.
Untracked connection closed.

On the client side

root@abhinaba-VivoBook:~# LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib /usr/local/libexec/mptcpd -d
configuration.c:mptcpd_config_create() path manager plugin directory: /usr/local/lib/mptcpd
configuration.c:mptcpd_config_create() default path manager plugin: sspi
path_manager.c:family_appeared() "mptcp_pm" generic netlink family appeared
MPTCP address advertiser path manager initialized.
MPTCP single-subflow-per-interface path manager initialized.
sspi_connection_established is unimplemented.
sspi_connection_established is unimplemented.
Untracked connection closed.

And on capturing the packets in wireshark, I observed new subflow creation is not taking place.

Is there some configuration that needs to be done from our end? In the plugins or the path-managers.

vandit86 commented 1 year ago

Hello, @abhinaba-fbr What kernel version did you use ?? did you make endpoint configuration with iptools? on client and server .. did you use mptcpsize with iperf3??

abhinaba-fbr commented 1 year ago

Hello @vandit86

Kernel version used is v5.19 Initially I did not configure the endpoints. Later I did make endpoints using ip mptcp, on both client and server and also used mptcpize with iperf3.

However, I observed the subflow is created if I keep pm_type=0 (Kernel mode). Started the mptcpd in both client and server. Once I changed it to pm_type=1 (userspace), and configure endpoints using ip mptcp, no additional subflow is being created.

I have few additional question? 1) If we are using mptcpd what is the need of configuring endpoints using ip mptcp. Isn't ip mptcp used for in-kernel path management?

2) Mptcpd is capable for both in-kernel and userspace path management. But how does mptcpd behave differently when pm_type is changed?

3) Is the sspi implementation currently in intel/mptcpd incomplete? Since I see several APIs (sspi_connection_established and sspi_new_address) are unimplemented.

vandit86 commented 1 year ago
  1. You can use for example mptcpd on client side, and in kernel pm on server side.. But if you use mptcpd, all PM logic should be implemented by yourself..
  2. Mptcpd is a userspace PM. now, MPTCP could be configured to use in-kernel or userspace PM by changing _net.mptcp.pmtype
abhinaba-fbr commented 1 year ago

Just for a bit clarification. What do you mean by PM logic, do you mean plugins (like add_adv and sspi) or we need to implement/modify PM handling operations (mptcpd/path_manager.c) as well?

I m planning to implement my own plugin, is there any documentations, which I can follow to understand the code-base and working of mptcpd.

vandit86 commented 1 year ago

Just for a bit clarification. What do you mean by PM logic, do you mean plugins (like add_adv and sspi) or we need to implement/modify PM handling operations (mptcpd/path_manager.c) as well?

yes in PM logic in plugin

I m planning to implement my own plugin, is there any documentations, which I can follow to understand the code-base and working of mptcpd.

see examples in plugins folder : e.x. sspi

abhinaba-fbr commented 1 year ago

Okay. Thanks.

I will look into it.

zzerodream commented 1 year ago

Hi, I am new to mptcpd. I have just installed mptcpd 0.9 on ubuntu 22.04, configured the routing table and endpoint by iproute2 and did some tests by mptcpize run iperf. I notice that mptcpd provides us with a way to customize our own path manager somehow. But I don't really understand what sspi is doing? Are there any more easy examples to help me start? Thank you so much.