net: ipv4: Notify about changes to ip_forward_update_priority
authorPetr Machata <petrm@mellanox.com>
Tue, 31 Jul 2018 22:36:42 +0000 (00:36 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 1 Aug 2018 16:52:30 +0000 (09:52 -0700)
Drivers may make offloading decision based on whether
ip_forward_update_priority is enabled or not. Therefore distribute
netevent notifications to give them a chance to react to a change.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/netevent.h
net/ipv4/sysctl_net_ipv4.c

index d9918261701c95ca1a2f598268549afdc286c6d6..4107016c3bb46d3eb6b31dcf16b3a2b76b75b2e9 100644 (file)
@@ -28,6 +28,7 @@ enum netevent_notif_type {
        NETEVENT_DELAY_PROBE_TIME_UPDATE, /* arg is struct neigh_parms ptr */
        NETEVENT_IPV4_MPATH_HASH_UPDATE, /* arg is struct net ptr */
        NETEVENT_IPV6_MPATH_HASH_UPDATE, /* arg is struct net ptr */
+       NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE, /* arg is struct net ptr */
 };
 
 int register_netevent_notifier(struct notifier_block *nb);
index e21dda01551347b40334f743d55add153b413e3a..b92f422f2fa805cd5cca8264fe9ae5aa6d6a65b8 100644 (file)
@@ -201,6 +201,23 @@ static int ipv4_ping_group_range(struct ctl_table *table, int write,
        return ret;
 }
 
+static int ipv4_fwd_update_priority(struct ctl_table *table, int write,
+                                   void __user *buffer,
+                                   size_t *lenp, loff_t *ppos)
+{
+       struct net *net;
+       int ret;
+
+       net = container_of(table->data, struct net,
+                          ipv4.sysctl_ip_fwd_update_priority);
+       ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
+       if (write && ret == 0)
+               call_netevent_notifiers(NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE,
+                                       net);
+
+       return ret;
+}
+
 static int proc_tcp_congestion_control(struct ctl_table *ctl, int write,
                                       void __user *buffer, size_t *lenp, loff_t *ppos)
 {
@@ -668,7 +685,7 @@ static struct ctl_table ipv4_net_table[] = {
                .data           = &init_net.ipv4.sysctl_ip_fwd_update_priority,
                .maxlen         = sizeof(int),
                .mode           = 0644,
-               .proc_handler   = proc_dointvec_minmax,
+               .proc_handler   = ipv4_fwd_update_priority,
                .extra1         = &zero,
                .extra2         = &one,
        },