@@ -279,8 +279,29 @@ static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt,
279
279
return 0 ;
280
280
}
281
281
282
+ /* Checks the validity of predefined bitrate settings */
283
+ static int can_validate_bitrate (struct net_device * dev , struct can_bittiming * bt ,
284
+ const u32 * bitrate_const ,
285
+ const unsigned int bitrate_const_cnt )
286
+ {
287
+ struct can_priv * priv = netdev_priv (dev );
288
+ unsigned int i ;
289
+
290
+ for (i = 0 ; i < bitrate_const_cnt ; i ++ ) {
291
+ if (bt -> bitrate == bitrate_const [i ])
292
+ break ;
293
+ }
294
+
295
+ if (i >= priv -> bitrate_const_cnt )
296
+ return - EINVAL ;
297
+
298
+ return 0 ;
299
+ }
300
+
282
301
static int can_get_bittiming (struct net_device * dev , struct can_bittiming * bt ,
283
- const struct can_bittiming_const * btc )
302
+ const struct can_bittiming_const * btc ,
303
+ const u32 * bitrate_const ,
304
+ const unsigned int bitrate_const_cnt )
284
305
{
285
306
int err ;
286
307
@@ -290,10 +311,13 @@ static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt,
290
311
* alternatively the CAN timing parameters (tq, prop_seg, etc.) are
291
312
* provided directly which are then checked and fixed up.
292
313
*/
293
- if (!bt -> tq && bt -> bitrate )
314
+ if (!bt -> tq && bt -> bitrate && btc )
294
315
err = can_calc_bittiming (dev , bt , btc );
295
- else if (bt -> tq && !bt -> bitrate )
316
+ else if (bt -> tq && !bt -> bitrate && btc )
296
317
err = can_fixup_bittiming (dev , bt , btc );
318
+ else if (!bt -> tq && bt -> bitrate && bitrate_const )
319
+ err = can_validate_bitrate (dev , bt , bitrate_const ,
320
+ bitrate_const_cnt );
297
321
else
298
322
err = - EINVAL ;
299
323
@@ -878,12 +902,12 @@ static int can_changelink(struct net_device *dev,
878
902
return - EOPNOTSUPP ;
879
903
880
904
memcpy (& bt , nla_data (data [IFLA_CAN_BITTIMING ]), sizeof (bt ));
881
- if ( priv -> bittiming_const ) {
882
- err = can_get_bittiming ( dev , & bt ,
883
- priv -> bittiming_const );
884
- if ( err )
885
- return err ;
886
- }
905
+ err = can_get_bittiming ( dev , & bt ,
906
+ priv -> bittiming_const ,
907
+ priv -> bitrate_const ,
908
+ priv -> bitrate_const_cnt );
909
+ if ( err )
910
+ return err ;
887
911
memcpy (& priv -> bittiming , & bt , sizeof (bt ));
888
912
889
913
if (priv -> do_set_bittiming ) {
@@ -962,12 +986,12 @@ static int can_changelink(struct net_device *dev,
962
986
963
987
memcpy (& dbt , nla_data (data [IFLA_CAN_DATA_BITTIMING ]),
964
988
sizeof (dbt ));
965
- if ( priv -> data_bittiming_const ) {
966
- err = can_get_bittiming ( dev , & dbt ,
967
- priv -> data_bittiming_const );
968
- if ( err )
969
- return err ;
970
- }
989
+ err = can_get_bittiming ( dev , & dbt ,
990
+ priv -> data_bittiming_const ,
991
+ priv -> data_bitrate_const ,
992
+ priv -> data_bitrate_const_cnt );
993
+ if ( err )
994
+ return err ;
971
995
memcpy (& priv -> data_bittiming , & dbt , sizeof (dbt ));
972
996
973
997
if (priv -> do_set_data_bittiming ) {
@@ -1029,6 +1053,12 @@ static size_t can_get_size(const struct net_device *dev)
1029
1053
size += nla_total_size (sizeof (* priv -> termination_const ) * /* IFLA_CAN_TERMINATION_CONST */
1030
1054
priv -> termination_const_cnt );
1031
1055
}
1056
+ if (priv -> bitrate_const ) /* IFLA_CAN_BITRATE_CONST */
1057
+ size += nla_total_size (sizeof (* priv -> bitrate_const ) *
1058
+ priv -> bitrate_const_cnt );
1059
+ if (priv -> data_bitrate_const ) /* IFLA_CAN_DATA_BITRATE_CONST */
1060
+ size += nla_total_size (sizeof (* priv -> data_bitrate_const ) *
1061
+ priv -> data_bitrate_const_cnt );
1032
1062
1033
1063
return size ;
1034
1064
}
@@ -1074,7 +1104,20 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
1074
1104
nla_put (skb , IFLA_CAN_TERMINATION_CONST ,
1075
1105
sizeof (* priv -> termination_const ) *
1076
1106
priv -> termination_const_cnt ,
1077
- priv -> termination_const ))))
1107
+ priv -> termination_const ))) ||
1108
+
1109
+ (priv -> bitrate_const &&
1110
+ nla_put (skb , IFLA_CAN_BITRATE_CONST ,
1111
+ sizeof (* priv -> bitrate_const ) *
1112
+ priv -> bitrate_const_cnt ,
1113
+ priv -> bitrate_const )) ||
1114
+
1115
+ (priv -> data_bitrate_const &&
1116
+ nla_put (skb , IFLA_CAN_DATA_BITRATE_CONST ,
1117
+ sizeof (* priv -> data_bitrate_const ) *
1118
+ priv -> data_bitrate_const_cnt ,
1119
+ priv -> data_bitrate_const ))
1120
+ )
1078
1121
1079
1122
return - EMSGSIZE ;
1080
1123
@@ -1140,6 +1183,12 @@ int register_candev(struct net_device *dev)
1140
1183
(!priv -> termination_const != !priv -> do_set_termination ))
1141
1184
return - EINVAL ;
1142
1185
1186
+ if (!priv -> bitrate_const != !priv -> bitrate_const_cnt )
1187
+ return - EINVAL ;
1188
+
1189
+ if (!priv -> data_bitrate_const != !priv -> data_bitrate_const_cnt )
1190
+ return - EINVAL ;
1191
+
1143
1192
dev -> rtnl_link_ops = & can_link_ops ;
1144
1193
return register_netdev (dev );
1145
1194
}
0 commit comments