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....@windriver.com>
Acked-by: Jon Maloy <jon.ma...@ericsson.com>
Signed-off-by: GhantaKrishnamurthy MohanKrishna 
<mohan.krishna.ghanta.krishnamur...@ericsson.com>
---
 include/uapi/linux/tipc_netlink.h |  1 +
 net/tipc/bearer.c                 | 13 +++++++++++++
 net/tipc/bearer.h                 |  3 +++
 net/tipc/udp_media.h              | 14 ++++++++++++++
 4 files changed, 31 insertions(+)

diff --git a/include/uapi/linux/tipc_netlink.h 
b/include/uapi/linux/tipc_netlink.h
index 0affb682e5e3..85c11982c89b 100644
--- a/include/uapi/linux/tipc_netlink.h
+++ b/include/uapi/linux/tipc_netlink.h
@@ -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
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index f7d47c89d658..a22caf9e5a18 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -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;
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
index 6efcee63a381..394290cbbb1d 100644
--- a/net/tipc/bearer.h
+++ b/net/tipc/bearer.h
@@ -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];
diff --git a/net/tipc/udp_media.h b/net/tipc/udp_media.h
index 281bbae87726..e7455cc73e16 100644
--- a/net/tipc/udp_media.h
+++ b/net/tipc/udp_media.h
@@ -38,9 +38,23 @@
 #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
-- 
2.1.4

Reply via email to