tipc: implement configuration of UDP media MTU
authorGhantaKrishnamurthy MohanKrishna <mohan.krishna.ghanta.krishnamurthy@ericsson.com>
Thu, 19 Apr 2018 09:06:19 +0000 (11:06 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Apr 2018 15:04:05 +0000 (11:04 -0400)
In previous commit, we changed the default emulated MTU for UDP bearers
to 14k.

This commit adds the functionality to set/change the default value
by configuring new MTU for UDP media. UDP bearer(s) have to be disabled
and enabled back for the new MTU to take effect.

Acked-by: Ying Xue <ying.xue@windriver.com>
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>
include/uapi/linux/tipc_netlink.h
net/tipc/bearer.c
net/tipc/bearer.h
net/tipc/udp_media.h

index 0affb682e5e398c7d6fa3f9169c6c803b19f6257..85c11982c89b38a3995db683d08b7f89ac2e3889 100644 (file)
@@ -266,6 +266,7 @@ enum {
        TIPC_NLA_PROP_PRIO,             /* u32 */
        TIPC_NLA_PROP_TOL,              /* u32 */
        TIPC_NLA_PROP_WIN,              /* u32 */
+       TIPC_NLA_PROP_MTU,              /* u32 */
 
        __TIPC_NLA_PROP_MAX,
        TIPC_NLA_PROP_MAX = __TIPC_NLA_PROP_MAX - 1
index f7d47c89d6581d1ac9836e1669ff67b4faf017c9..a22caf9e5a18e3e567071d46280747ee5905f711 100644 (file)
@@ -1029,6 +1029,9 @@ static int __tipc_nl_add_media(struct tipc_nl_msg *msg,
                goto prop_msg_full;
        if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, media->window))
                goto prop_msg_full;
+       if (media->type_id == TIPC_MEDIA_TYPE_UDP)
+               if (nla_put_u32(msg->skb, TIPC_NLA_PROP_MTU, media->mtu))
+                       goto prop_msg_full;
 
        nla_nest_end(msg->skb, prop);
        nla_nest_end(msg->skb, attrs);
@@ -1158,6 +1161,16 @@ int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
                        m->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
                if (props[TIPC_NLA_PROP_WIN])
                        m->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
+               if (props[TIPC_NLA_PROP_MTU]) {
+                       if (m->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;
+                       m->mtu = nla_get_u32(props[TIPC_NLA_PROP_MTU]);
+#endif
+               }
        }
 
        return 0;
index 6efcee63a3819cf13b15704c870b05b7c5745990..394290cbbb1deb72b1742425cea7da5e98795e6e 100644 (file)
@@ -94,6 +94,8 @@ struct tipc_bearer;
  * @priority: default link (and bearer) priority
  * @tolerance: default time (in ms) before declaring link failure
  * @window: default window (in packets) before declaring link congestion
+ * @mtu: max packet size bearer can support for media type not dependent on
+ * underlying device MTU
  * @type_id: TIPC media identifier
  * @hwaddr_len: TIPC media address len
  * @name: media name
@@ -118,6 +120,7 @@ struct tipc_media {
        u32 priority;
        u32 tolerance;
        u32 window;
+       u32 mtu;
        u32 type_id;
        u32 hwaddr_len;
        char name[TIPC_MAX_MEDIA_NAME];
index 281bbae8772645a5c7981030f671a96625577c44..e7455cc73e16c0e3ff1f1b371427b4910ef6b395 100644 (file)
 #ifndef _TIPC_UDP_MEDIA_H
 #define _TIPC_UDP_MEDIA_H
 
+#include <linux/ip.h>
+#include <linux/udp.h>
+
 int tipc_udp_nl_bearer_add(struct tipc_bearer *b, struct nlattr *attr);
 int tipc_udp_nl_add_bearer_data(struct tipc_nl_msg *msg, struct tipc_bearer *b);
 int tipc_udp_nl_dump_remoteip(struct sk_buff *skb, struct netlink_callback *cb);
 
+/* check if configured MTU is too low for tipc headers */
+static inline bool tipc_udp_mtu_bad(u32 mtu)
+{
+       if (mtu >= (TIPC_MIN_BEARER_MTU + sizeof(struct iphdr) +
+           sizeof(struct udphdr)))
+               return false;
+
+       pr_warn("MTU too low for tipc bearer\n");
+       return true;
+}
+
 #endif
 #endif