diff options
| author | Oliver Hartkopp <socketcan@hartkopp.net> | 2013-01-17 12:43:46 -0500 |
|---|---|---|
| committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2013-01-26 10:59:02 -0500 |
| commit | e6afa00a1409bc3bceed9ccb33111519463dfe7b (patch) | |
| tree | 90a039fdf39a111f7f9510ff012808277a0f2a65 | |
| parent | be286bafe1f4069094865264f29805854c5788bf (diff) | |
can: gw: indicate and count deleted frames due to misconfiguration
Add a statistic counter to detect deleted frames due to misconfiguration with
a new read-only CGW_DELETED netlink attribute for the CAN gateway.
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
| -rw-r--r-- | include/uapi/linux/can/gw.h | 1 | ||||
| -rw-r--r-- | net/can/gw.c | 12 |
2 files changed, 12 insertions, 1 deletions
diff --git a/include/uapi/linux/can/gw.h b/include/uapi/linux/can/gw.h index 0505c7f86213..ae07bec74f4b 100644 --- a/include/uapi/linux/can/gw.h +++ b/include/uapi/linux/can/gw.h | |||
| @@ -44,6 +44,7 @@ enum { | |||
| 44 | CGW_SRC_IF, /* ifindex of source network interface */ | 44 | CGW_SRC_IF, /* ifindex of source network interface */ |
| 45 | CGW_DST_IF, /* ifindex of destination network interface */ | 45 | CGW_DST_IF, /* ifindex of destination network interface */ |
| 46 | CGW_FILTER, /* specify struct can_filter on source CAN device */ | 46 | CGW_FILTER, /* specify struct can_filter on source CAN device */ |
| 47 | CGW_DELETED, /* number of deleted CAN frames (see max_hops param) */ | ||
| 47 | __CGW_MAX | 48 | __CGW_MAX |
| 48 | }; | 49 | }; |
| 49 | 50 | ||
diff --git a/net/can/gw.c b/net/can/gw.c index 4216a80618cb..acdd4656cc3b 100644 --- a/net/can/gw.c +++ b/net/can/gw.c | |||
| @@ -131,6 +131,7 @@ struct cgw_job { | |||
| 131 | struct rcu_head rcu; | 131 | struct rcu_head rcu; |
| 132 | u32 handled_frames; | 132 | u32 handled_frames; |
| 133 | u32 dropped_frames; | 133 | u32 dropped_frames; |
| 134 | u32 deleted_frames; | ||
| 134 | struct cf_mod mod; | 135 | struct cf_mod mod; |
| 135 | union { | 136 | union { |
| 136 | /* CAN frame data source */ | 137 | /* CAN frame data source */ |
| @@ -367,8 +368,11 @@ static void can_can_gw_rcv(struct sk_buff *skb, void *data) | |||
| 367 | 368 | ||
| 368 | BUG_ON(skb->ip_summed != CHECKSUM_UNNECESSARY); | 369 | BUG_ON(skb->ip_summed != CHECKSUM_UNNECESSARY); |
| 369 | 370 | ||
| 370 | if (cgw_hops(skb) >= max_hops) | 371 | if (cgw_hops(skb) >= max_hops) { |
| 372 | /* indicate deleted frames due to misconfiguration */ | ||
| 373 | gwj->deleted_frames++; | ||
| 371 | return; | 374 | return; |
| 375 | } | ||
| 372 | 376 | ||
| 373 | if (!(gwj->dst.dev->flags & IFF_UP)) { | 377 | if (!(gwj->dst.dev->flags & IFF_UP)) { |
| 374 | gwj->dropped_frames++; | 378 | gwj->dropped_frames++; |
| @@ -500,6 +504,11 @@ static int cgw_put_job(struct sk_buff *skb, struct cgw_job *gwj, int type, | |||
| 500 | goto cancel; | 504 | goto cancel; |
| 501 | } | 505 | } |
| 502 | 506 | ||
| 507 | if (gwj->deleted_frames) { | ||
| 508 | if (nla_put_u32(skb, CGW_DELETED, gwj->deleted_frames) < 0) | ||
| 509 | goto cancel; | ||
| 510 | } | ||
| 511 | |||
| 503 | /* check non default settings of attributes */ | 512 | /* check non default settings of attributes */ |
| 504 | 513 | ||
| 505 | if (gwj->mod.modtype.and) { | 514 | if (gwj->mod.modtype.and) { |
| @@ -799,6 +808,7 @@ static int cgw_create_job(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 799 | 808 | ||
| 800 | gwj->handled_frames = 0; | 809 | gwj->handled_frames = 0; |
| 801 | gwj->dropped_frames = 0; | 810 | gwj->dropped_frames = 0; |
| 811 | gwj->deleted_frames = 0; | ||
| 802 | gwj->flags = r->flags; | 812 | gwj->flags = r->flags; |
| 803 | gwj->gwtype = r->gwtype; | 813 | gwj->gwtype = r->gwtype; |
| 804 | 814 | ||
