forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-11 297b60346df8beafee954a0fd7c2d64f33f3b9bc
kernel/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
....@@ -1,16 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
23 *
3
- * This program is free software; you can redistribute it and/or modify
4
- * it under the terms of the GNU General Public License version 2 and
5
- * only version 2 as published by the Free Software Foundation.
6
- *
7
- * This program is distributed in the hope that it will be useful,
8
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
- * GNU General Public License for more details.
11
- *
124 * RMNET configuration engine
13
- *
145 */
156
167 #include <net/sock.h>
....@@ -35,7 +26,7 @@
3526 }
3627
3728 /* Needs rtnl lock */
38
-static struct rmnet_port*
29
+struct rmnet_port*
3930 rmnet_get_port_rtnl(const struct net_device *real_dev)
4031 {
4132 return rtnl_dereference(real_dev->rx_handler_data);
....@@ -74,7 +65,7 @@
7465 return 0;
7566 }
7667
77
- port = kzalloc(sizeof(*port), GFP_ATOMIC);
68
+ port = kzalloc(sizeof(*port), GFP_KERNEL);
7869 if (!port)
7970 return -ENOMEM;
8071
....@@ -139,13 +130,12 @@
139130 }
140131
141132 real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
142
- if (!real_dev || !dev)
133
+ if (!real_dev) {
134
+ NL_SET_ERR_MSG_MOD(extack, "link does not exist");
143135 return -ENODEV;
136
+ }
144137
145
- if (!data[IFLA_RMNET_MUX_ID])
146
- return -EINVAL;
147
-
148
- ep = kzalloc(sizeof(*ep), GFP_ATOMIC);
138
+ ep = kzalloc(sizeof(*ep), GFP_KERNEL);
149139 if (!ep)
150140 return -ENOMEM;
151141
....@@ -156,7 +146,7 @@
156146 goto err0;
157147
158148 port = rmnet_get_port_rtnl(real_dev);
159
- err = rmnet_vnd_newlink(mux_id, dev, port, real_dev, ep);
149
+ err = rmnet_vnd_newlink(mux_id, dev, port, real_dev, ep, extack);
160150 if (err)
161151 goto err1;
162152
....@@ -263,7 +253,10 @@
263253 netdev_dbg(real_dev, "Kernel unregister\n");
264254 rmnet_force_unassociate_device(real_dev);
265255 break;
266
-
256
+ case NETDEV_CHANGEMTU:
257
+ if (rmnet_vnd_validate_real_dev_mtu(real_dev))
258
+ return NOTIFY_BAD;
259
+ break;
267260 default:
268261 break;
269262 }
....@@ -280,12 +273,16 @@
280273 {
281274 u16 mux_id;
282275
283
- if (!data || !data[IFLA_RMNET_MUX_ID])
276
+ if (!data || !data[IFLA_RMNET_MUX_ID]) {
277
+ NL_SET_ERR_MSG_MOD(extack, "MUX ID not specified");
284278 return -EINVAL;
279
+ }
285280
286281 mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]);
287
- if (mux_id > (RMNET_MAX_LOGICAL_EP - 1))
282
+ if (mux_id > (RMNET_MAX_LOGICAL_EP - 1)) {
283
+ NL_SET_ERR_MSG_MOD(extack, "invalid MUX ID");
288284 return -ERANGE;
285
+ }
289286
290287 return 0;
291288 }
....@@ -335,9 +332,17 @@
335332
336333 if (data[IFLA_RMNET_FLAGS]) {
337334 struct ifla_rmnet_flags *flags;
335
+ u32 old_data_format;
338336
337
+ old_data_format = port->data_format;
339338 flags = nla_data(data[IFLA_RMNET_FLAGS]);
340339 port->data_format = flags->flags & flags->mask;
340
+
341
+ if (rmnet_vnd_update_dev_mtu(port, real_dev)) {
342
+ port->data_format = old_data_format;
343
+ NL_SET_ERR_MSG_MOD(extack, "Invalid MTU on real dev");
344
+ return -EINVAL;
345
+ }
341346 }
342347
343348 return 0;
....@@ -430,11 +435,22 @@
430435 /* If there is more than one rmnet dev attached, its probably being
431436 * used for muxing. Skip the briding in that case
432437 */
433
- if (port->nr_rmnet_devs > 1)
438
+ if (port->nr_rmnet_devs > 1) {
439
+ NL_SET_ERR_MSG_MOD(extack, "more than one rmnet dev attached");
434440 return -EINVAL;
441
+ }
435442
436
- if (rmnet_is_real_dev_registered(slave_dev))
443
+ if (port->rmnet_mode != RMNET_EPMODE_VND) {
444
+ NL_SET_ERR_MSG_MOD(extack, "more than one bridge dev attached");
445
+ return -EINVAL;
446
+ }
447
+
448
+ if (rmnet_is_real_dev_registered(slave_dev)) {
449
+ NL_SET_ERR_MSG_MOD(extack,
450
+ "slave cannot be another rmnet dev");
451
+
437452 return -EBUSY;
453
+ }
438454
439455 err = rmnet_register_real_device(slave_dev, extack);
440456 if (err)
....@@ -496,4 +512,5 @@
496512
497513 module_init(rmnet_init)
498514 module_exit(rmnet_exit)
515
+MODULE_ALIAS_RTNL_LINK("rmnet");
499516 MODULE_LICENSE("GPL v2");