]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tipc: confgiure and apply UDP bearer MTU on running links
authorGhantaKrishnamurthy MohanKrishna <mohan.krishna.ghanta.krishnamurthy@ericsson.com>
Thu, 19 Apr 2018 09:06:20 +0000 (11:06 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Apr 2018 15:04:05 +0000 (11:04 -0400)
Currently, we have option to configure MTU of UDP media. The configured
MTU takes effect on the links going up after that moment. I.e, a user
has to reset bearer to have new value applied across its links. This is
confusing and disturbing on a running cluster.

We now introduce the functionality to change the default UDP bearer MTU
in struct tipc_bearer. Additionally, the links are updated dynamically,
without any need for a reset, when bearer value is changed. We leverage
the existing per-link functionality and the design being symetrical to
the confguration of link tolerance.

Acked-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: GhantaKrishnamurthy MohanKrishna <mohan.krishna.ghanta.krishnamurthy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/bearer.c
net/tipc/node.c
net/tipc/node.h

index a22caf9e5a18e3e567071d46280747ee5905f711..2dfb492a7c943b61f1b0c551faa6ba1230f3159f 100644 (file)
@@ -697,6 +697,9 @@ static int __tipc_nl_add_bearer(struct tipc_nl_msg *msg,
                goto prop_msg_full;
        if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, bearer->window))
                goto prop_msg_full;
+       if (bearer->media->type_id == TIPC_MEDIA_TYPE_UDP)
+               if (nla_put_u32(msg->skb, TIPC_NLA_PROP_MTU, bearer->mtu))
+                       goto prop_msg_full;
 
        nla_nest_end(msg->skb, prop);
 
@@ -979,12 +982,23 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
 
                if (props[TIPC_NLA_PROP_TOL]) {
                        b->tolerance = nla_get_u32(props[TIPC_NLA_PROP_TOL]);
-                       tipc_node_apply_tolerance(net, b);
+                       tipc_node_apply_property(net, b, TIPC_NLA_PROP_TOL);
                }
                if (props[TIPC_NLA_PROP_PRIO])
                        b->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
                if (props[TIPC_NLA_PROP_WIN])
                        b->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
+               if (props[TIPC_NLA_PROP_MTU]) {
+                       if (b->media->type_id != TIPC_MEDIA_TYPE_UDP)
+                               return -EINVAL;
+#ifdef CONFIG_TIPC_MEDIA_UDP
+                       if (tipc_udp_mtu_bad(nla_get_u32
+                                            (props[TIPC_NLA_PROP_MTU])))
+                               return -EINVAL;
+                       b->mtu = nla_get_u32(props[TIPC_NLA_PROP_MTU]);
+                       tipc_node_apply_property(net, b, TIPC_NLA_PROP_MTU);
+#endif
+               }
        }
 
        return 0;
index c77dd2f3c5898e5c9d05f3a9e5fa72e2dc729bd0..b71e4e376bb94e49aa9f7c244b0dfdf920fef895 100644 (file)
@@ -1681,7 +1681,8 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)
        kfree_skb(skb);
 }
 
-void tipc_node_apply_tolerance(struct net *net, struct tipc_bearer *b)
+void tipc_node_apply_property(struct net *net, struct tipc_bearer *b,
+                             int prop)
 {
        struct tipc_net *tn = tipc_net(net);
        int bearer_id = b->identity;
@@ -1696,8 +1697,13 @@ void tipc_node_apply_tolerance(struct net *net, struct tipc_bearer *b)
        list_for_each_entry_rcu(n, &tn->node_list, list) {
                tipc_node_write_lock(n);
                e = &n->links[bearer_id];
-               if (e->link)
-                       tipc_link_set_tolerance(e->link, b->tolerance, &xmitq);
+               if (e->link) {
+                       if (prop == TIPC_NLA_PROP_TOL)
+                               tipc_link_set_tolerance(e->link, b->tolerance,
+                                                       &xmitq);
+                       else if (prop == TIPC_NLA_PROP_MTU)
+                               tipc_link_set_mtu(e->link, b->mtu);
+               }
                tipc_node_write_unlock(n);
                tipc_bearer_xmit(net, bearer_id, &xmitq, &e->maddr);
        }
index f24b83500df151cfcda9e063523c2b015518449e..bb271a37c93f841443cd33d1a510118638be39f5 100644 (file)
@@ -67,7 +67,7 @@ void tipc_node_check_dest(struct net *net, u32 onode, u8 *peer_id128,
                          struct tipc_media_addr *maddr,
                          bool *respond, bool *dupl_addr);
 void tipc_node_delete_links(struct net *net, int bearer_id);
-void tipc_node_apply_tolerance(struct net *net, struct tipc_bearer *b);
+void tipc_node_apply_property(struct net *net, struct tipc_bearer *b, int prop);
 int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 node,
                           char *linkname, size_t len);
 int tipc_node_xmit(struct net *net, struct sk_buff_head *list, u32 dnode,