* [MPTCP] [PATCH 1/9] Extend path manager interface
@ 2019-07-17 22:12 Peter Krystad
0 siblings, 0 replies; 3+ messages in thread
From: Peter Krystad @ 2019-07-17 22:12 UTC (permalink / raw)
To: mptcp
[-- Attachment #1: Type: text/plain, Size: 8245 bytes --]
A little more functionality and some comments clarifying
which routines are for a path manager to call and which are
callbacks.
squashto: Add path manager interface
Signed-off-by: Peter Krystad <peter.krystad(a)linux.intel.com>
---
net/mptcp/options.c | 19 +++++++++--
net/mptcp/pm.c | 77 ++++++++++++++++++++++++++++++++++++++++----
net/mptcp/protocol.c | 5 +--
net/mptcp/protocol.h | 35 ++++++++++++++++----
4 files changed, 117 insertions(+), 19 deletions(-)
diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index 58215f19829a..0d0d47f84adb 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -412,10 +412,10 @@ static bool mptcp_established_options_addr(struct sock *sk,
struct subflow_context *subflow = subflow_ctx(sk);
struct mptcp_sock *msk = mptcp_sk(subflow->conn);
- if (subflow->fourth_ack)
- return pm_addr_signal(msk, size, remaining, opts);
+ if (!msk)
+ return false;
- return false;
+ return pm_addr_signal(msk, size, remaining, opts);
}
bool mptcp_established_options(struct sock *sk, struct sk_buff *skb,
@@ -479,11 +479,20 @@ bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,
void mptcp_attach_dss(struct sock *sk, struct sk_buff *skb,
struct tcp_options_received *opt_rx)
{
+ struct subflow_context *subflow = subflow_ctx(sk);
+ struct mptcp_sock *msk = mptcp_sk(subflow->conn);
struct mptcp_options_received *mp_opt;
struct mptcp_ext *mpext;
mp_opt = &opt_rx->mptcp;
+ if (mp_opt->add_addr && mp_opt->family == MPTCP_ADDR_IPVERSION_4) {
+ if (msk) {
+ pm_add_addr(msk, &mp_opt->addr, mp_opt->addr_id);
+ mp_opt->add_addr = 0;
+ }
+ }
+
if (!mp_opt->dss)
return;
@@ -510,6 +519,10 @@ void mptcp_attach_dss(struct sock *sk, struct sk_buff *skb,
}
mpext->data_fin = mp_opt->data_fin;
+
+ if (msk)
+ pm_fully_established(msk);
+
}
void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 9e9c681a4544..0d53a0f23d2d 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -8,14 +8,42 @@
#include <net/mptcp.h>
#include "protocol.h"
-void pm_new_connection(struct mptcp_sock *msk)
+/* path manager command handlers */
+
+int pm_announce_addr(u32 token, sa_family_t family, u8 id, struct in_addr *addr)
+{
+ return -ENOTSUPP;
+}
+
+int pm_remove_addr(u32 token, u8 id)
+{
+ return -ENOTSUPP;
+}
+
+int pm_create_subflow(u32 token, u8 local_id, u8 remote_id)
+{
+ return -ENOTSUPP;
+}
+
+int pm_remove_subflow(u32 token, u8 local_id, u8 remote_id)
+{
+ return -ENOTSUPP;
+}
+
+/* path manager event handlers */
+
+void pm_new_connection(struct mptcp_sock *msk, int server_side)
{
pr_debug("msk=%p", msk);
+
+ msk->pm.server_side = server_side;
}
void pm_fully_established(struct mptcp_sock *msk)
{
pr_debug("msk=%p", msk);
+
+ msk->pm.fully_established = 1;
}
void pm_connection_closed(struct mptcp_sock *msk)
@@ -35,7 +63,13 @@ void pm_subflow_closed(struct mptcp_sock *msk, u8 id)
void pm_add_addr(struct mptcp_sock *msk, const struct in_addr *addr, u8 id)
{
- pr_debug("msk=%p", msk);
+ pr_debug("msk=%p, addr=%x, remote_id=%d", msk, addr->s_addr, id);
+
+ msk->pm.remote_valid = 1;
+ msk->pm.remote_token = msk->token;
+ msk->pm.remote_addr.s_addr = addr->s_addr;
+ msk->pm.remote_id = id;
+ msk->pm.remote_family = AF_INET;
}
void pm_add_addr6(struct mptcp_sock *msk, const struct in6_addr *addr, u8 id)
@@ -48,19 +82,48 @@ void pm_rm_addr(struct mptcp_sock *msk, u8 id)
pr_debug("msk=%p", msk);
}
+/* path manager helpers */
+
bool pm_addr_signal(struct mptcp_sock *msk, unsigned int *size,
unsigned int remaining, struct mptcp_out_options *opts)
{
- if (!msk || !msk->addr_signal)
+ if (!msk->pm.fully_established || !msk->addr_signal)
return false;
- if (msk->pm.family == AF_INET && remaining < TCPOLEN_MPTCP_ADD_ADDR)
+ if (!msk->pm.local_valid)
return false;
- pr_debug("msk=%p", msk);
+ if (msk->pm.local_family == AF_INET &&
+ remaining < TCPOLEN_MPTCP_ADD_ADDR)
+ return false;
+
+ pr_debug("msk=%p, addr_id=%d", msk, msk->pm.local_id);
opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
- opts->addr_id = msk->pm.addr_id;
- opts->addr.s_addr = msk->pm.addr.s_addr;
+ opts->addr_id = msk->pm.local_id;
+ opts->addr.s_addr = msk->pm.local_addr.s_addr;
+ *size = TCPOLEN_MPTCP_ADD_ADDR;
+ msk->addr_signal = 0;
return true;
}
+
+int pm_get_local_id(struct request_sock *req, struct sock *sk,
+ const struct sk_buff *skb)
+{
+ struct subflow_request_sock *subflow_req = subflow_rsk(req);
+ struct mptcp_sock *msk = mptcp_sk(sk);
+
+ if (!msk->pm.local_valid)
+ return -1;
+
+ /* @@ check if address actually matches... */
+
+ pr_debug("msk=%p, addr_id=%d", msk, msk->pm.local_id);
+ subflow_req->local_id = msk->pm.local_id;
+
+ return 0;
+}
+
+void pm_init(void)
+{
+}
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 774ed25d3b6d..a56085742cf7 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -632,7 +632,7 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err,
token_update_accept(new_sock->sk, new_mptcp_sock);
msk->subflow = NULL;
- pm_new_connection(msk);
+ pm_new_connection(msk, 1);
crypto_key_sha1(msk->remote_key, NULL, &ack_seq);
msk->write_seq = subflow->idsn + 1;
@@ -759,7 +759,7 @@ void mptcp_finish_connect(struct sock *sk, int mp_capable)
msk->token = subflow->token;
pr_debug("msk=%p, token=%u", msk, msk->token);
- pm_new_connection(msk);
+ pm_new_connection(msk, 0);
crypto_key_sha1(msk->remote_key, NULL, &ack_seq);
msk->write_seq = subflow->idsn + 1;
@@ -1008,6 +1008,7 @@ void __init mptcp_init(void)
token_init();
crypto_init();
subflow_init();
+ pm_init();
if (proto_register(&mptcp_prot, 1) != 0)
panic("Failed to register MPTCP proto.\n");
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 7f15f6aab93d..8c04774ea2ec 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -77,15 +77,33 @@ static inline u32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
((nib & 0xF) << 8) | field);
}
-struct pm_data {
- u8 addr_id;
- sa_family_t family;
+struct mptcp_pm_data {
+ u8 local_valid;
+ u8 local_id;
+ sa_family_t local_family;
+ union {
+ struct in_addr local_addr;
+#if IS_ENABLED(CONFIG_IPV6)
+ struct in6_addr local_addr6;
+#endif
+ };
+ u8 remote_valid;
+ u8 remote_id;
+ sa_family_t remote_family;
union {
- struct in_addr addr;
+ struct in_addr remote_addr;
#if IS_ENABLED(CONFIG_IPV6)
- struct in6_addr addr6;
+ struct in6_addr remote_addr6;
#endif
};
+ u32 remote_token;
+ u8 server_side : 1,
+ fully_established : 1;
+
+ /* for interim path manager */
+ struct work_struct addr_work;
+ struct work_struct subflow_work;
+ u32 token;
};
/* MPTCP connection sock */
@@ -99,7 +117,7 @@ struct mptcp_sock {
u32 token;
struct list_head conn_list;
struct socket *subflow; /* outgoing connect/listener/!mp_capable */
- struct pm_data pm;
+ struct mptcp_pm_data pm;
u8 addr_signal;
};
@@ -222,7 +240,8 @@ void crypto_key_sha1(u64 key, u32 *token, u64 *idsn);
void crypto_hmac_sha1(u64 key1, u64 key2, u32 *hash_out,
int arg_num, ...);
-void pm_new_connection(struct mptcp_sock *msk);
+void pm_init(void);
+void pm_new_connection(struct mptcp_sock *msk, int server_side);
void pm_fully_established(struct mptcp_sock *msk);
void pm_connection_closed(struct mptcp_sock *msk);
void pm_subflow_established(struct mptcp_sock *msk, u8 id);
@@ -232,6 +251,8 @@ void pm_add_addr6(struct mptcp_sock *msk, const struct in6_addr *addr, u8 id);
void pm_rm_addr(struct mptcp_sock *msk, u8 id);
bool pm_addr_signal(struct mptcp_sock *msk, unsigned int *size,
unsigned int remaining, struct mptcp_out_options *opts);
+int pm_get_local_id(struct request_sock *req, struct sock *sk,
+ const struct sk_buff *skb);
static inline struct mptcp_ext *mptcp_get_ext(struct sk_buff *skb)
{
--
2.17.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [MPTCP] [PATCH 1/9] Extend path manager interface
@ 2019-07-18 7:29 Paolo Abeni
0 siblings, 0 replies; 3+ messages in thread
From: Paolo Abeni @ 2019-07-18 7:29 UTC (permalink / raw)
To: mptcp
[-- Attachment #1: Type: text/plain, Size: 2374 bytes --]
Hi,
I have some questions out of sheer ignorance on my side, please see
below ;)
On Wed, 2019-07-17 at 15:12 -0700, Peter Krystad wrote:
> @@ -48,19 +82,48 @@ void pm_rm_addr(struct mptcp_sock *msk, u8 id)
> pr_debug("msk=%p", msk);
> }
>
> +/* path manager helpers */
> +
> bool pm_addr_signal(struct mptcp_sock *msk, unsigned int *size,
> unsigned int remaining, struct mptcp_out_options *opts)
> {
> - if (!msk || !msk->addr_signal)
> + if (!msk->pm.fully_established || !msk->addr_signal)
> return false;
>
> - if (msk->pm.family == AF_INET && remaining < TCPOLEN_MPTCP_ADD_ADDR)
> + if (!msk->pm.local_valid)
> return false;
>
> - pr_debug("msk=%p", msk);
> + if (msk->pm.local_family == AF_INET &&
> + remaining < TCPOLEN_MPTCP_ADD_ADDR)
> + return false;
> +
> + pr_debug("msk=%p, addr_id=%d", msk, msk->pm.local_id);
> opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
> - opts->addr_id = msk->pm.addr_id;
> - opts->addr.s_addr = msk->pm.addr.s_addr;
> + opts->addr_id = msk->pm.local_id;
> + opts->addr.s_addr = msk->pm.local_addr.s_addr;
> + *size = TCPOLEN_MPTCP_ADD_ADDR;
> + msk->addr_signal = 0;
Strictly speaking not related to this patch, but more to the existing
code... perhaps 'opts' updating belong to
options.c/mptcp_established_options_addr() more than the path manager?
> index 7f15f6aab93d..8c04774ea2ec 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -77,15 +77,33 @@ static inline u32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
> ((nib & 0xF) << 8) | field);
> }
>
> -struct pm_data {
> - u8 addr_id;
> - sa_family_t family;
> +struct mptcp_pm_data {
> + u8 local_valid;
> + u8 local_id;
> + sa_family_t local_family;
> + union {
> + struct in_addr local_addr;
> +#if IS_ENABLED(CONFIG_IPV6)
> + struct in6_addr local_addr6;
> +#endif
> + };
> + u8 remote_valid;
> + u8 remote_id;
> + sa_family_t remote_family;
> union {
> - struct in_addr addr;
> + struct in_addr remote_addr;
> #if IS_ENABLED(CONFIG_IPV6)
> - struct in6_addr addr6;
> + struct in6_addr remote_addr6;
> #endif
> };
Are we going to need a list/container here? (to handle multiples addrs)
I see is likely too early to cope with the extra complexity, just to
have a clearer picture of the road ahead ;)
Cheers,
Paolo
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [MPTCP] [PATCH 1/9] Extend path manager interface
@ 2019-07-18 17:45 Peter Krystad
0 siblings, 0 replies; 3+ messages in thread
From: Peter Krystad @ 2019-07-18 17:45 UTC (permalink / raw)
To: mptcp
[-- Attachment #1: Type: text/plain, Size: 2776 bytes --]
On Thu, 2019-07-18 at 09:29 +0200, Paolo Abeni wrote:
> Hi,
>
> I have some questions out of sheer ignorance on my side, please see
> below ;)
>
> On Wed, 2019-07-17 at 15:12 -0700, Peter Krystad wrote:
> > @@ -48,19 +82,48 @@ void pm_rm_addr(struct mptcp_sock *msk, u8 id)
> > pr_debug("msk=%p", msk);
> > }
> >
> > +/* path manager helpers */
> > +
> > bool pm_addr_signal(struct mptcp_sock *msk, unsigned int *size,
> > unsigned int remaining, struct mptcp_out_options *opts)
> > {
> > - if (!msk || !msk->addr_signal)
> > + if (!msk->pm.fully_established || !msk->addr_signal)
> > return false;
> >
> > - if (msk->pm.family == AF_INET && remaining < TCPOLEN_MPTCP_ADD_ADDR)
> > + if (!msk->pm.local_valid)
> > return false;
> >
> > - pr_debug("msk=%p", msk);
> > + if (msk->pm.local_family == AF_INET &&
> > + remaining < TCPOLEN_MPTCP_ADD_ADDR)
> > + return false;
> > +
> > + pr_debug("msk=%p, addr_id=%d", msk, msk->pm.local_id);
> > opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
> > - opts->addr_id = msk->pm.addr_id;
> > - opts->addr.s_addr = msk->pm.addr.s_addr;
> > + opts->addr_id = msk->pm.local_id;
> > + opts->addr.s_addr = msk->pm.local_addr.s_addr;
> > + *size = TCPOLEN_MPTCP_ADD_ADDR;
> > + msk->addr_signal = 0;
>
> Strictly speaking not related to this patch, but more to the existing
> code... perhaps 'opts' updating belong to
> options.c/mptcp_established_options_addr() more than the path manager?
Agreed, I'll revise.
>
> > index 7f15f6aab93d..8c04774ea2ec 100644
> > --- a/net/mptcp/protocol.h
> > +++ b/net/mptcp/protocol.h
> > @@ -77,15 +77,33 @@ static inline u32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
> > ((nib & 0xF) << 8) | field);
> > }
> >
> > -struct pm_data {
> > - u8 addr_id;
> > - sa_family_t family;
> > +struct mptcp_pm_data {
> > + u8 local_valid;
> > + u8 local_id;
> > + sa_family_t local_family;
> > + union {
> > + struct in_addr local_addr;
> > +#if IS_ENABLED(CONFIG_IPV6)
> > + struct in6_addr local_addr6;
> > +#endif
> > + };
> > + u8 remote_valid;
> > + u8 remote_id;
> > + sa_family_t remote_family;
> > union {
> > - struct in_addr addr;
> > + struct in_addr remote_addr;
> > #if IS_ENABLED(CONFIG_IPV6)
> > - struct in6_addr addr6;
> > + struct in6_addr remote_addr6;
> > #endif
> > };
>
> Are we going to need a list/container here? (to handle multiples addrs)
> I see is likely too early to cope with the extra complexity, just to
> have a clearer picture of the road ahead ;)
>
Indeed. For now this is a list of length one. :)
Although you night argue for some of our primary use cases this is probably
enough...
Peter.
> Cheers,
>
> Paolo
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2019-07-18 17:45 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-07-17 22:12 [MPTCP] [PATCH 1/9] Extend path manager interface Peter Krystad
-- strict thread matches above, loose matches on Subject: below --
2019-07-18 7:29 Paolo Abeni
2019-07-18 17:45 Peter Krystad
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.