return ret;
 }
 
+unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk)
+{
+       struct pm_nl_pernet *pernet;
+
+       pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id);
+       return READ_ONCE(pernet->add_addr_signal_max);
+}
+EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_signal_max);
+
+unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk)
+{
+       struct pm_nl_pernet *pernet;
+
+       pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id);
+       return READ_ONCE(pernet->add_addr_accept_max);
+}
+EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_accept_max);
+
+unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk)
+{
+       struct pm_nl_pernet *pernet;
+
+       pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id);
+       return READ_ONCE(pernet->subflows_max);
+}
+EXPORT_SYMBOL_GPL(mptcp_pm_get_subflows_max);
+
+static unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk)
+{
+       struct pm_nl_pernet *pernet;
+
+       pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id);
+       return READ_ONCE(pernet->local_addr_max);
+}
+
 static void check_work_pending(struct mptcp_sock *msk)
 {
-       if (msk->pm.add_addr_signaled == msk->pm.add_addr_signal_max &&
-           (msk->pm.local_addr_used == msk->pm.local_addr_max ||
-            msk->pm.subflows == msk->pm.subflows_max))
+       if (msk->pm.add_addr_signaled == mptcp_pm_get_add_addr_signal_max(msk) &&
+           (msk->pm.local_addr_used == mptcp_pm_get_local_addr_max(msk) ||
+            msk->pm.subflows == mptcp_pm_get_subflows_max(msk)))
                WRITE_ONCE(msk->pm.work_pending, false);
 }
 
 {
        struct sock *sk = (struct sock *)msk;
        struct mptcp_pm_addr_entry *local;
+       unsigned int add_addr_signal_max;
+       unsigned int local_addr_max;
        struct pm_nl_pernet *pernet;
+       unsigned int subflows_max;
 
        pernet = net_generic(sock_net(sk), pm_nl_pernet_id);
 
+       add_addr_signal_max = mptcp_pm_get_add_addr_signal_max(msk);
+       local_addr_max = mptcp_pm_get_local_addr_max(msk);
+       subflows_max = mptcp_pm_get_subflows_max(msk);
+
        pr_debug("local %d:%d signal %d:%d subflows %d:%d\n",
-                msk->pm.local_addr_used, msk->pm.local_addr_max,
-                msk->pm.add_addr_signaled, msk->pm.add_addr_signal_max,
-                msk->pm.subflows, msk->pm.subflows_max);
+                msk->pm.local_addr_used, local_addr_max,
+                msk->pm.add_addr_signaled, add_addr_signal_max,
+                msk->pm.subflows, subflows_max);
 
        /* check first for announce */
-       if (msk->pm.add_addr_signaled < msk->pm.add_addr_signal_max) {
+       if (msk->pm.add_addr_signaled < add_addr_signal_max) {
                local = select_signal_address(pernet,
                                              msk->pm.add_addr_signaled);
 
                        }
                } else {
                        /* pick failed, avoid fourther attempts later */
-                       msk->pm.local_addr_used = msk->pm.add_addr_signal_max;
+                       msk->pm.local_addr_used = add_addr_signal_max;
                }
 
                check_work_pending(msk);
        }
 
        /* check if should create a new subflow */
-       if (msk->pm.local_addr_used < msk->pm.local_addr_max &&
-           msk->pm.subflows < msk->pm.subflows_max) {
+       if (msk->pm.local_addr_used < local_addr_max &&
+           msk->pm.subflows < subflows_max) {
                local = select_local_address(pernet, msk);
                if (local) {
                        struct mptcp_addr_info remote = { 0 };
                }
 
                /* lookup failed, avoid fourther attempts later */
-               msk->pm.local_addr_used = msk->pm.local_addr_max;
+               msk->pm.local_addr_used = local_addr_max;
                check_work_pending(msk);
        }
 }
 void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
 {
        struct sock *sk = (struct sock *)msk;
+       unsigned int add_addr_accept_max;
        struct mptcp_addr_info remote;
        struct mptcp_addr_info local;
+       unsigned int subflows_max;
        bool use_port = false;
 
+       add_addr_accept_max = mptcp_pm_get_add_addr_accept_max(msk);
+       subflows_max = mptcp_pm_get_subflows_max(msk);
+
        pr_debug("accepted %d:%d remote family %d",
-                msk->pm.add_addr_accepted, msk->pm.add_addr_accept_max,
+                msk->pm.add_addr_accepted, add_addr_accept_max,
                 msk->pm.remote.family);
        msk->pm.add_addr_accepted++;
        msk->pm.subflows++;
-       if (msk->pm.add_addr_accepted >= msk->pm.add_addr_accept_max ||
-           msk->pm.subflows >= msk->pm.subflows_max)
+       if (msk->pm.add_addr_accepted >= add_addr_accept_max ||
+           msk->pm.subflows >= subflows_max)
                WRITE_ONCE(msk->pm.accept_addr, false);
 
        /* connect to the specified remote address, using whatever
 void mptcp_pm_nl_data_init(struct mptcp_sock *msk)
 {
        struct mptcp_pm_data *pm = &msk->pm;
-       struct pm_nl_pernet *pernet;
        bool subflows;
 
-       pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id);
-
-       pm->add_addr_signal_max = READ_ONCE(pernet->add_addr_signal_max);
-       pm->add_addr_accept_max = READ_ONCE(pernet->add_addr_accept_max);
-       pm->local_addr_max = READ_ONCE(pernet->local_addr_max);
-       pm->subflows_max = READ_ONCE(pernet->subflows_max);
-       subflows = !!pm->subflows_max;
-       WRITE_ONCE(pm->work_pending, (!!pm->local_addr_max && subflows) ||
-                  !!pm->add_addr_signal_max);
-       WRITE_ONCE(pm->accept_addr, !!pm->add_addr_accept_max && subflows);
+       subflows = !!mptcp_pm_get_subflows_max(msk);
+       WRITE_ONCE(pm->work_pending, (!!mptcp_pm_get_local_addr_max(msk) && subflows) ||
+                  !!mptcp_pm_get_add_addr_signal_max(msk));
+       WRITE_ONCE(pm->accept_addr, !!mptcp_pm_get_add_addr_accept_max(msk) && subflows);
        WRITE_ONCE(pm->accept_subflow, subflows);
 }