1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (C) 2005 Marc Kleine-Budde, Pengutronix
3 * Copyright (C) 2006 Andrey Volkov, Varma Electronics
4 * Copyright (C) 2008-2009 Wolfgang Grandegger <wg@grandegger.com>
5 * Copyright (C) 2021 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
8 #include <linux/can/dev.h>
9 #include <net/rtnetlink.h>
11 static const struct nla_policy can_policy
[IFLA_CAN_MAX
+ 1] = {
12 [IFLA_CAN_STATE
] = { .type
= NLA_U32
},
13 [IFLA_CAN_CTRLMODE
] = { .len
= sizeof(struct can_ctrlmode
) },
14 [IFLA_CAN_RESTART_MS
] = { .type
= NLA_U32
},
15 [IFLA_CAN_RESTART
] = { .type
= NLA_U32
},
16 [IFLA_CAN_BITTIMING
] = { .len
= sizeof(struct can_bittiming
) },
17 [IFLA_CAN_BITTIMING_CONST
] = { .len
= sizeof(struct can_bittiming_const
) },
18 [IFLA_CAN_CLOCK
] = { .len
= sizeof(struct can_clock
) },
19 [IFLA_CAN_BERR_COUNTER
] = { .len
= sizeof(struct can_berr_counter
) },
20 [IFLA_CAN_DATA_BITTIMING
] = { .len
= sizeof(struct can_bittiming
) },
21 [IFLA_CAN_DATA_BITTIMING_CONST
] = { .len
= sizeof(struct can_bittiming_const
) },
22 [IFLA_CAN_TERMINATION
] = { .type
= NLA_U16
},
23 [IFLA_CAN_TDC
] = { .type
= NLA_NESTED
},
24 [IFLA_CAN_CTRLMODE_EXT
] = { .type
= NLA_NESTED
},
27 static const struct nla_policy can_tdc_policy
[IFLA_CAN_TDC_MAX
+ 1] = {
28 [IFLA_CAN_TDC_TDCV_MIN
] = { .type
= NLA_U32
},
29 [IFLA_CAN_TDC_TDCV_MAX
] = { .type
= NLA_U32
},
30 [IFLA_CAN_TDC_TDCO_MIN
] = { .type
= NLA_U32
},
31 [IFLA_CAN_TDC_TDCO_MAX
] = { .type
= NLA_U32
},
32 [IFLA_CAN_TDC_TDCF_MIN
] = { .type
= NLA_U32
},
33 [IFLA_CAN_TDC_TDCF_MAX
] = { .type
= NLA_U32
},
34 [IFLA_CAN_TDC_TDCV
] = { .type
= NLA_U32
},
35 [IFLA_CAN_TDC_TDCO
] = { .type
= NLA_U32
},
36 [IFLA_CAN_TDC_TDCF
] = { .type
= NLA_U32
},
39 static int can_validate_bittiming(const struct can_bittiming
*bt
,
40 struct netlink_ext_ack
*extack
)
42 /* sample point is in one-tenth of a percent */
43 if (bt
->sample_point
>= 1000) {
44 NL_SET_ERR_MSG(extack
, "sample point must be between 0 and 100%");
52 static int can_validate(struct nlattr
*tb
[], struct nlattr
*data
[],
53 struct netlink_ext_ack
*extack
)
55 bool is_can_fd
= false;
58 /* Make sure that valid CAN FD configurations always consist of
59 * - nominal/arbitration bittiming
61 * - control mode with CAN_CTRLMODE_FD set
62 * - TDC parameters are coherent (details below)
68 if (data
[IFLA_CAN_CTRLMODE
]) {
69 struct can_ctrlmode
*cm
= nla_data(data
[IFLA_CAN_CTRLMODE
]);
70 u32 tdc_flags
= cm
->flags
& CAN_CTRLMODE_TDC_MASK
;
72 is_can_fd
= cm
->flags
& cm
->mask
& CAN_CTRLMODE_FD
;
74 /* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually exclusive */
75 if (tdc_flags
== CAN_CTRLMODE_TDC_MASK
)
77 /* If one of the CAN_CTRLMODE_TDC_* flag is set then
78 * TDC must be set and vice-versa
80 if (!!tdc_flags
!= !!data
[IFLA_CAN_TDC
])
82 /* If providing TDC parameters, at least TDCO is
83 * needed. TDCV is needed if and only if
84 * CAN_CTRLMODE_TDC_MANUAL is set
86 if (data
[IFLA_CAN_TDC
]) {
87 struct nlattr
*tb_tdc
[IFLA_CAN_TDC_MAX
+ 1];
89 err
= nla_parse_nested(tb_tdc
, IFLA_CAN_TDC_MAX
,
91 can_tdc_policy
, extack
);
95 if (tb_tdc
[IFLA_CAN_TDC_TDCV
]) {
96 if (tdc_flags
& CAN_CTRLMODE_TDC_AUTO
)
99 if (tdc_flags
& CAN_CTRLMODE_TDC_MANUAL
)
103 if (!tb_tdc
[IFLA_CAN_TDC_TDCO
])
108 if (data
[IFLA_CAN_BITTIMING
]) {
109 struct can_bittiming bt
;
111 memcpy(&bt
, nla_data(data
[IFLA_CAN_BITTIMING
]), sizeof(bt
));
112 err
= can_validate_bittiming(&bt
, extack
);
118 if (!data
[IFLA_CAN_BITTIMING
] || !data
[IFLA_CAN_DATA_BITTIMING
])
122 if (data
[IFLA_CAN_DATA_BITTIMING
] || data
[IFLA_CAN_TDC
]) {
127 if (data
[IFLA_CAN_DATA_BITTIMING
]) {
128 struct can_bittiming bt
;
130 memcpy(&bt
, nla_data(data
[IFLA_CAN_DATA_BITTIMING
]), sizeof(bt
));
131 err
= can_validate_bittiming(&bt
, extack
);
139 static int can_tdc_changelink(struct can_priv
*priv
, const struct nlattr
*nla
,
140 struct netlink_ext_ack
*extack
)
142 struct nlattr
*tb_tdc
[IFLA_CAN_TDC_MAX
+ 1];
143 struct can_tdc tdc
= { 0 };
144 const struct can_tdc_const
*tdc_const
= priv
->tdc_const
;
147 if (!tdc_const
|| !can_tdc_is_enabled(priv
))
150 err
= nla_parse_nested(tb_tdc
, IFLA_CAN_TDC_MAX
, nla
,
151 can_tdc_policy
, extack
);
155 if (tb_tdc
[IFLA_CAN_TDC_TDCV
]) {
156 u32 tdcv
= nla_get_u32(tb_tdc
[IFLA_CAN_TDC_TDCV
]);
158 if (tdcv
< tdc_const
->tdcv_min
|| tdcv
> tdc_const
->tdcv_max
)
164 if (tb_tdc
[IFLA_CAN_TDC_TDCO
]) {
165 u32 tdco
= nla_get_u32(tb_tdc
[IFLA_CAN_TDC_TDCO
]);
167 if (tdco
< tdc_const
->tdco_min
|| tdco
> tdc_const
->tdco_max
)
173 if (tb_tdc
[IFLA_CAN_TDC_TDCF
]) {
174 u32 tdcf
= nla_get_u32(tb_tdc
[IFLA_CAN_TDC_TDCF
]);
176 if (tdcf
< tdc_const
->tdcf_min
|| tdcf
> tdc_const
->tdcf_max
)
187 static int can_changelink(struct net_device
*dev
, struct nlattr
*tb
[],
188 struct nlattr
*data
[],
189 struct netlink_ext_ack
*extack
)
191 struct can_priv
*priv
= netdev_priv(dev
);
195 /* We need synchronization with dev->stop() */
198 if (data
[IFLA_CAN_CTRLMODE
]) {
199 struct can_ctrlmode
*cm
;
203 /* Do not allow changing controller mode while running */
204 if (dev
->flags
& IFF_UP
)
206 cm
= nla_data(data
[IFLA_CAN_CTRLMODE
]);
207 ctrlstatic
= can_get_static_ctrlmode(priv
);
208 maskedflags
= cm
->flags
& cm
->mask
;
210 /* check whether provided bits are allowed to be passed */
211 if (maskedflags
& ~(priv
->ctrlmode_supported
| ctrlstatic
))
214 /* do not check for static fd-non-iso if 'fd' is disabled */
215 if (!(maskedflags
& CAN_CTRLMODE_FD
))
216 ctrlstatic
&= ~CAN_CTRLMODE_FD_NON_ISO
;
218 /* make sure static options are provided by configuration */
219 if ((maskedflags
& ctrlstatic
) != ctrlstatic
)
222 /* clear bits to be modified and copy the flag values */
223 priv
->ctrlmode
&= ~cm
->mask
;
224 priv
->ctrlmode
|= maskedflags
;
226 /* CAN_CTRLMODE_FD can only be set when driver supports FD */
227 if (priv
->ctrlmode
& CAN_CTRLMODE_FD
) {
228 dev
->mtu
= CANFD_MTU
;
231 memset(&priv
->data_bittiming
, 0,
232 sizeof(priv
->data_bittiming
));
233 priv
->ctrlmode
&= ~CAN_CTRLMODE_TDC_MASK
;
234 memset(&priv
->tdc
, 0, sizeof(priv
->tdc
));
237 tdc_mask
= cm
->mask
& CAN_CTRLMODE_TDC_MASK
;
238 /* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually
239 * exclusive: make sure to turn the other one off
242 priv
->ctrlmode
&= cm
->flags
| ~CAN_CTRLMODE_TDC_MASK
;
245 if (data
[IFLA_CAN_BITTIMING
]) {
246 struct can_bittiming bt
;
248 /* Do not allow changing bittiming while running */
249 if (dev
->flags
& IFF_UP
)
252 /* Calculate bittiming parameters based on
253 * bittiming_const if set, otherwise pass bitrate
254 * directly via do_set_bitrate(). Bail out if neither
257 if (!priv
->bittiming_const
&& !priv
->do_set_bittiming
&&
258 !priv
->bitrate_const
)
261 memcpy(&bt
, nla_data(data
[IFLA_CAN_BITTIMING
]), sizeof(bt
));
262 err
= can_get_bittiming(dev
, &bt
,
263 priv
->bittiming_const
,
265 priv
->bitrate_const_cnt
,
270 if (priv
->bitrate_max
&& bt
.bitrate
> priv
->bitrate_max
) {
271 NL_SET_ERR_MSG_FMT(extack
,
272 "arbitration bitrate %u bps surpasses transceiver capabilities of %u bps",
273 bt
.bitrate
, priv
->bitrate_max
);
277 memcpy(&priv
->bittiming
, &bt
, sizeof(bt
));
279 if (priv
->do_set_bittiming
) {
280 /* Finally, set the bit-timing registers */
281 err
= priv
->do_set_bittiming(dev
);
287 if (data
[IFLA_CAN_RESTART_MS
]) {
288 /* Do not allow changing restart delay while running */
289 if (dev
->flags
& IFF_UP
)
291 priv
->restart_ms
= nla_get_u32(data
[IFLA_CAN_RESTART_MS
]);
294 if (data
[IFLA_CAN_RESTART
]) {
295 /* Do not allow a restart while not running */
296 if (!(dev
->flags
& IFF_UP
))
298 err
= can_restart_now(dev
);
303 if (data
[IFLA_CAN_DATA_BITTIMING
]) {
304 struct can_bittiming dbt
;
306 /* Do not allow changing bittiming while running */
307 if (dev
->flags
& IFF_UP
)
310 /* Calculate bittiming parameters based on
311 * data_bittiming_const if set, otherwise pass bitrate
312 * directly via do_set_bitrate(). Bail out if neither
315 if (!priv
->data_bittiming_const
&& !priv
->do_set_data_bittiming
&&
316 !priv
->data_bitrate_const
)
319 memcpy(&dbt
, nla_data(data
[IFLA_CAN_DATA_BITTIMING
]),
321 err
= can_get_bittiming(dev
, &dbt
,
322 priv
->data_bittiming_const
,
323 priv
->data_bitrate_const
,
324 priv
->data_bitrate_const_cnt
,
329 if (priv
->bitrate_max
&& dbt
.bitrate
> priv
->bitrate_max
) {
330 NL_SET_ERR_MSG_FMT(extack
,
331 "CANFD data bitrate %u bps surpasses transceiver capabilities of %u bps",
332 dbt
.bitrate
, priv
->bitrate_max
);
336 memset(&priv
->tdc
, 0, sizeof(priv
->tdc
));
337 if (data
[IFLA_CAN_TDC
]) {
338 /* TDC parameters are provided: use them */
339 err
= can_tdc_changelink(priv
, data
[IFLA_CAN_TDC
],
342 priv
->ctrlmode
&= ~CAN_CTRLMODE_TDC_MASK
;
345 } else if (!tdc_mask
) {
346 /* Neither of TDC parameters nor TDC flags are
347 * provided: do calculation
349 can_calc_tdco(&priv
->tdc
, priv
->tdc_const
, &dbt
,
350 &priv
->ctrlmode
, priv
->ctrlmode_supported
);
351 } /* else: both CAN_CTRLMODE_TDC_{AUTO,MANUAL} are explicitly
352 * turned off. TDC is disabled: do nothing
355 memcpy(&priv
->data_bittiming
, &dbt
, sizeof(dbt
));
357 if (priv
->do_set_data_bittiming
) {
358 /* Finally, set the bit-timing registers */
359 err
= priv
->do_set_data_bittiming(dev
);
365 if (data
[IFLA_CAN_TERMINATION
]) {
366 const u16 termval
= nla_get_u16(data
[IFLA_CAN_TERMINATION
]);
367 const unsigned int num_term
= priv
->termination_const_cnt
;
370 if (!priv
->do_set_termination
)
373 /* check whether given value is supported by the interface */
374 for (i
= 0; i
< num_term
; i
++) {
375 if (termval
== priv
->termination_const
[i
])
381 /* Finally, set the termination value */
382 err
= priv
->do_set_termination(dev
, termval
);
386 priv
->termination
= termval
;
392 static size_t can_tdc_get_size(const struct net_device
*dev
)
394 struct can_priv
*priv
= netdev_priv(dev
);
397 if (!priv
->tdc_const
)
400 size
= nla_total_size(0); /* nest IFLA_CAN_TDC */
401 if (priv
->ctrlmode_supported
& CAN_CTRLMODE_TDC_MANUAL
) {
402 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCV_MIN */
403 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCV_MAX */
405 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCO_MIN */
406 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCO_MAX */
407 if (priv
->tdc_const
->tdcf_max
) {
408 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCF_MIN */
409 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCF_MAX */
412 if (can_tdc_is_enabled(priv
)) {
413 if (priv
->ctrlmode
& CAN_CTRLMODE_TDC_MANUAL
||
414 priv
->do_get_auto_tdcv
)
415 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCV */
416 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCO */
417 if (priv
->tdc_const
->tdcf_max
)
418 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_TDCF */
424 static size_t can_ctrlmode_ext_get_size(void)
426 return nla_total_size(0) + /* nest IFLA_CAN_CTRLMODE_EXT */
427 nla_total_size(sizeof(u32
)); /* IFLA_CAN_CTRLMODE_SUPPORTED */
430 static size_t can_get_size(const struct net_device
*dev
)
432 struct can_priv
*priv
= netdev_priv(dev
);
435 if (priv
->bittiming
.bitrate
) /* IFLA_CAN_BITTIMING */
436 size
+= nla_total_size(sizeof(struct can_bittiming
));
437 if (priv
->bittiming_const
) /* IFLA_CAN_BITTIMING_CONST */
438 size
+= nla_total_size(sizeof(struct can_bittiming_const
));
439 size
+= nla_total_size(sizeof(struct can_clock
)); /* IFLA_CAN_CLOCK */
440 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_STATE */
441 size
+= nla_total_size(sizeof(struct can_ctrlmode
)); /* IFLA_CAN_CTRLMODE */
442 size
+= nla_total_size(sizeof(u32
)); /* IFLA_CAN_RESTART_MS */
443 if (priv
->do_get_berr_counter
) /* IFLA_CAN_BERR_COUNTER */
444 size
+= nla_total_size(sizeof(struct can_berr_counter
));
445 if (priv
->data_bittiming
.bitrate
) /* IFLA_CAN_DATA_BITTIMING */
446 size
+= nla_total_size(sizeof(struct can_bittiming
));
447 if (priv
->data_bittiming_const
) /* IFLA_CAN_DATA_BITTIMING_CONST */
448 size
+= nla_total_size(sizeof(struct can_bittiming_const
));
449 if (priv
->termination_const
) {
450 size
+= nla_total_size(sizeof(priv
->termination
)); /* IFLA_CAN_TERMINATION */
451 size
+= nla_total_size(sizeof(*priv
->termination_const
) * /* IFLA_CAN_TERMINATION_CONST */
452 priv
->termination_const_cnt
);
454 if (priv
->bitrate_const
) /* IFLA_CAN_BITRATE_CONST */
455 size
+= nla_total_size(sizeof(*priv
->bitrate_const
) *
456 priv
->bitrate_const_cnt
);
457 if (priv
->data_bitrate_const
) /* IFLA_CAN_DATA_BITRATE_CONST */
458 size
+= nla_total_size(sizeof(*priv
->data_bitrate_const
) *
459 priv
->data_bitrate_const_cnt
);
460 size
+= sizeof(priv
->bitrate_max
); /* IFLA_CAN_BITRATE_MAX */
461 size
+= can_tdc_get_size(dev
); /* IFLA_CAN_TDC */
462 size
+= can_ctrlmode_ext_get_size(); /* IFLA_CAN_CTRLMODE_EXT */
467 static int can_tdc_fill_info(struct sk_buff
*skb
, const struct net_device
*dev
)
470 struct can_priv
*priv
= netdev_priv(dev
);
471 struct can_tdc
*tdc
= &priv
->tdc
;
472 const struct can_tdc_const
*tdc_const
= priv
->tdc_const
;
477 nest
= nla_nest_start(skb
, IFLA_CAN_TDC
);
481 if (priv
->ctrlmode_supported
& CAN_CTRLMODE_TDC_MANUAL
&&
482 (nla_put_u32(skb
, IFLA_CAN_TDC_TDCV_MIN
, tdc_const
->tdcv_min
) ||
483 nla_put_u32(skb
, IFLA_CAN_TDC_TDCV_MAX
, tdc_const
->tdcv_max
)))
485 if (nla_put_u32(skb
, IFLA_CAN_TDC_TDCO_MIN
, tdc_const
->tdco_min
) ||
486 nla_put_u32(skb
, IFLA_CAN_TDC_TDCO_MAX
, tdc_const
->tdco_max
))
488 if (tdc_const
->tdcf_max
&&
489 (nla_put_u32(skb
, IFLA_CAN_TDC_TDCF_MIN
, tdc_const
->tdcf_min
) ||
490 nla_put_u32(skb
, IFLA_CAN_TDC_TDCF_MAX
, tdc_const
->tdcf_max
)))
493 if (can_tdc_is_enabled(priv
)) {
497 if (priv
->ctrlmode
& CAN_CTRLMODE_TDC_MANUAL
) {
500 } else if (priv
->do_get_auto_tdcv
) {
501 err
= priv
->do_get_auto_tdcv(dev
, &tdcv
);
503 if (!err
&& nla_put_u32(skb
, IFLA_CAN_TDC_TDCV
, tdcv
))
505 if (nla_put_u32(skb
, IFLA_CAN_TDC_TDCO
, tdc
->tdco
))
507 if (tdc_const
->tdcf_max
&&
508 nla_put_u32(skb
, IFLA_CAN_TDC_TDCF
, tdc
->tdcf
))
512 nla_nest_end(skb
, nest
);
516 nla_nest_cancel(skb
, nest
);
520 static int can_ctrlmode_ext_fill_info(struct sk_buff
*skb
,
521 const struct can_priv
*priv
)
525 nest
= nla_nest_start(skb
, IFLA_CAN_CTRLMODE_EXT
);
529 if (nla_put_u32(skb
, IFLA_CAN_CTRLMODE_SUPPORTED
,
530 priv
->ctrlmode_supported
)) {
531 nla_nest_cancel(skb
, nest
);
535 nla_nest_end(skb
, nest
);
539 static int can_fill_info(struct sk_buff
*skb
, const struct net_device
*dev
)
541 struct can_priv
*priv
= netdev_priv(dev
);
542 struct can_ctrlmode cm
= {.flags
= priv
->ctrlmode
};
543 struct can_berr_counter bec
= { };
544 enum can_state state
= priv
->state
;
546 if (priv
->do_get_state
)
547 priv
->do_get_state(dev
, &state
);
549 if ((priv
->bittiming
.bitrate
!= CAN_BITRATE_UNSET
&&
550 priv
->bittiming
.bitrate
!= CAN_BITRATE_UNKNOWN
&&
551 nla_put(skb
, IFLA_CAN_BITTIMING
,
552 sizeof(priv
->bittiming
), &priv
->bittiming
)) ||
554 (priv
->bittiming_const
&&
555 nla_put(skb
, IFLA_CAN_BITTIMING_CONST
,
556 sizeof(*priv
->bittiming_const
), priv
->bittiming_const
)) ||
558 nla_put(skb
, IFLA_CAN_CLOCK
, sizeof(priv
->clock
), &priv
->clock
) ||
559 nla_put_u32(skb
, IFLA_CAN_STATE
, state
) ||
560 nla_put(skb
, IFLA_CAN_CTRLMODE
, sizeof(cm
), &cm
) ||
561 nla_put_u32(skb
, IFLA_CAN_RESTART_MS
, priv
->restart_ms
) ||
563 (priv
->do_get_berr_counter
&&
564 !priv
->do_get_berr_counter(dev
, &bec
) &&
565 nla_put(skb
, IFLA_CAN_BERR_COUNTER
, sizeof(bec
), &bec
)) ||
567 (priv
->data_bittiming
.bitrate
&&
568 nla_put(skb
, IFLA_CAN_DATA_BITTIMING
,
569 sizeof(priv
->data_bittiming
), &priv
->data_bittiming
)) ||
571 (priv
->data_bittiming_const
&&
572 nla_put(skb
, IFLA_CAN_DATA_BITTIMING_CONST
,
573 sizeof(*priv
->data_bittiming_const
),
574 priv
->data_bittiming_const
)) ||
576 (priv
->termination_const
&&
577 (nla_put_u16(skb
, IFLA_CAN_TERMINATION
, priv
->termination
) ||
578 nla_put(skb
, IFLA_CAN_TERMINATION_CONST
,
579 sizeof(*priv
->termination_const
) *
580 priv
->termination_const_cnt
,
581 priv
->termination_const
))) ||
583 (priv
->bitrate_const
&&
584 nla_put(skb
, IFLA_CAN_BITRATE_CONST
,
585 sizeof(*priv
->bitrate_const
) *
586 priv
->bitrate_const_cnt
,
587 priv
->bitrate_const
)) ||
589 (priv
->data_bitrate_const
&&
590 nla_put(skb
, IFLA_CAN_DATA_BITRATE_CONST
,
591 sizeof(*priv
->data_bitrate_const
) *
592 priv
->data_bitrate_const_cnt
,
593 priv
->data_bitrate_const
)) ||
595 (nla_put(skb
, IFLA_CAN_BITRATE_MAX
,
596 sizeof(priv
->bitrate_max
),
597 &priv
->bitrate_max
)) ||
599 can_tdc_fill_info(skb
, dev
) ||
601 can_ctrlmode_ext_fill_info(skb
, priv
)
609 static size_t can_get_xstats_size(const struct net_device
*dev
)
611 return sizeof(struct can_device_stats
);
614 static int can_fill_xstats(struct sk_buff
*skb
, const struct net_device
*dev
)
616 struct can_priv
*priv
= netdev_priv(dev
);
618 if (nla_put(skb
, IFLA_INFO_XSTATS
,
619 sizeof(priv
->can_stats
), &priv
->can_stats
))
620 goto nla_put_failure
;
627 static int can_newlink(struct net
*src_net
, struct net_device
*dev
,
628 struct nlattr
*tb
[], struct nlattr
*data
[],
629 struct netlink_ext_ack
*extack
)
634 static void can_dellink(struct net_device
*dev
, struct list_head
*head
)
638 struct rtnl_link_ops can_link_ops __read_mostly
= {
640 .netns_refund
= true,
641 .maxtype
= IFLA_CAN_MAX
,
642 .policy
= can_policy
,
644 .validate
= can_validate
,
645 .newlink
= can_newlink
,
646 .changelink
= can_changelink
,
647 .dellink
= can_dellink
,
648 .get_size
= can_get_size
,
649 .fill_info
= can_fill_info
,
650 .get_xstats_size
= can_get_xstats_size
,
651 .fill_xstats
= can_fill_xstats
,
654 int can_netlink_register(void)
656 return rtnl_link_register(&can_link_ops
);
659 void can_netlink_unregister(void)
661 rtnl_link_unregister(&can_link_ops
);