File tree Expand file tree Collapse file tree 3 files changed +37
-0
lines changed
Expand file tree Collapse file tree 3 files changed +37
-0
lines changed Original file line number Diff line number Diff line change @@ -627,6 +627,9 @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
627627 pm -> rm_list_tx .nr = 0 ;
628628 pm -> rm_list_rx .nr = 0 ;
629629 WRITE_ONCE (pm -> pm_type , pm_type );
630+ rcu_read_lock ();
631+ mptcp_pm_initialize (msk , mptcp_pm_find (pm_type ));
632+ rcu_read_unlock ();
630633
631634 if (pm_type == MPTCP_PM_TYPE_KERNEL ) {
632635 bool subflows_allowed = !!mptcp_pm_get_subflows_max (msk );
@@ -721,3 +724,33 @@ void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
721724 list_del_rcu (& pm -> list );
722725 spin_unlock (& mptcp_pm_list_lock );
723726}
727+
728+ int mptcp_pm_initialize (struct mptcp_sock * msk , struct mptcp_pm_ops * pm )
729+ {
730+ if (!pm )
731+ return - EINVAL ;
732+
733+ if (!bpf_try_module_get (pm , pm -> owner ))
734+ return - EBUSY ;
735+
736+ msk -> pm .ops = pm ;
737+ if (msk -> pm .ops -> init )
738+ msk -> pm .ops -> init (msk );
739+
740+ pr_debug ("userspace_pm type %u initialized\n" , msk -> pm .ops -> type );
741+ return 0 ;
742+ }
743+
744+ void mptcp_pm_release (struct mptcp_sock * msk )
745+ {
746+ struct mptcp_pm_ops * pm = msk -> pm .ops ;
747+
748+ if (!pm )
749+ return ;
750+
751+ msk -> pm .ops = NULL ;
752+ if (pm -> release )
753+ pm -> release (msk );
754+
755+ bpf_module_put (pm , pm -> owner );
756+ }
Original file line number Diff line number Diff line change @@ -2944,6 +2944,7 @@ static void __mptcp_destroy_sock(struct sock *sk)
29442944 sk_stop_timer (sk , & sk -> sk_timer );
29452945 msk -> pm .status = 0 ;
29462946 mptcp_release_sched (msk );
2947+ mptcp_pm_release (msk );
29472948
29482949 sk -> sk_prot -> destroy (sk );
29492950
Original file line number Diff line number Diff line change @@ -220,6 +220,7 @@ struct mptcp_pm_data {
220220 struct mptcp_addr_info remote ;
221221 struct list_head anno_list ;
222222 struct list_head userspace_pm_local_addr_list ;
223+ struct mptcp_pm_ops * ops ;
223224
224225 spinlock_t lock ; /*protects the whole PM data */
225226
@@ -1043,6 +1044,8 @@ struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
10431044int mptcp_pm_validate (struct mptcp_pm_ops * pm );
10441045int mptcp_pm_register (struct mptcp_pm_ops * pm );
10451046void mptcp_pm_unregister (struct mptcp_pm_ops * pm );
1047+ int mptcp_pm_initialize (struct mptcp_sock * msk , struct mptcp_pm_ops * pm );
1048+ void mptcp_pm_release (struct mptcp_sock * msk );
10461049
10471050void mptcp_free_local_addr_list (struct mptcp_sock * msk );
10481051
You can’t perform that action at this time.
0 commit comments