31
31
#include <net/net_namespace.h>
32
32
#include <net/bonding.h>
33
33
#include <net/bond_3ad.h>
34
+ #include <net/netlink.h>
34
35
35
36
/* General definitions */
36
37
#define AD_SHORT_TIMEOUT 1
@@ -851,6 +852,8 @@ static int ad_lacpdu_send(struct port *port)
851
852
if (!skb )
852
853
return - ENOMEM ;
853
854
855
+ atomic64_inc (& SLAVE_AD_INFO (slave )-> stats .lacpdu_tx );
856
+
854
857
skb -> dev = slave -> dev ;
855
858
skb_reset_mac_header (skb );
856
859
skb -> network_header = skb -> mac_header + ETH_HLEN ;
@@ -892,6 +895,15 @@ static int ad_marker_send(struct port *port, struct bond_marker *marker)
892
895
if (!skb )
893
896
return - ENOMEM ;
894
897
898
+ switch (marker -> tlv_type ) {
899
+ case AD_MARKER_INFORMATION_SUBTYPE :
900
+ atomic64_inc (& SLAVE_AD_INFO (slave )-> stats .marker_tx );
901
+ break ;
902
+ case AD_MARKER_RESPONSE_SUBTYPE :
903
+ atomic64_inc (& SLAVE_AD_INFO (slave )-> stats .marker_resp_tx );
904
+ break ;
905
+ }
906
+
895
907
skb_reserve (skb , 16 );
896
908
897
909
skb -> dev = slave -> dev ;
@@ -1086,6 +1098,9 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
1086
1098
*/
1087
1099
last_state = port -> sm_rx_state ;
1088
1100
1101
+ if (lacpdu )
1102
+ atomic64_inc (& SLAVE_AD_INFO (port -> slave )-> stats .lacpdu_rx );
1103
+
1089
1104
/* check if state machine should change state */
1090
1105
1091
1106
/* first, check if port was reinitialized */
@@ -1922,6 +1937,8 @@ static void ad_marker_info_received(struct bond_marker *marker_info,
1922
1937
{
1923
1938
struct bond_marker marker ;
1924
1939
1940
+ atomic64_inc (& SLAVE_AD_INFO (port -> slave )-> stats .marker_rx );
1941
+
1925
1942
/* copy the received marker data to the response marker */
1926
1943
memcpy (& marker , marker_info , sizeof (struct bond_marker ));
1927
1944
/* change the marker subtype to marker response */
@@ -1946,6 +1963,8 @@ static void ad_marker_info_received(struct bond_marker *marker_info,
1946
1963
static void ad_marker_response_received (struct bond_marker * marker ,
1947
1964
struct port * port )
1948
1965
{
1966
+ atomic64_inc (& SLAVE_AD_INFO (port -> slave )-> stats .marker_resp_rx );
1967
+
1949
1968
/* DO NOTHING, SINCE WE DECIDED NOT TO IMPLEMENT THIS FEATURE FOR NOW */
1950
1969
}
1951
1970
@@ -2348,66 +2367,64 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
2348
2367
* bond_3ad_rx_indication - handle a received frame
2349
2368
* @lacpdu: received lacpdu
2350
2369
* @slave: slave struct to work on
2351
- * @length: length of the data received
2352
2370
*
2353
2371
* It is assumed that frames that were sent on this NIC don't returned as new
2354
2372
* received frames (loopback). Since only the payload is given to this
2355
2373
* function, it check for loopback.
2356
2374
*/
2357
- static int bond_3ad_rx_indication (struct lacpdu * lacpdu , struct slave * slave ,
2358
- u16 length )
2375
+ static int bond_3ad_rx_indication (struct lacpdu * lacpdu , struct slave * slave )
2359
2376
{
2360
- struct port * port ;
2361
2377
int ret = RX_HANDLER_ANOTHER ;
2378
+ struct bond_marker * marker ;
2379
+ struct port * port ;
2380
+ atomic64_t * stat ;
2362
2381
2363
- if (length >= sizeof (struct lacpdu )) {
2364
-
2365
- port = & (SLAVE_AD_INFO (slave )-> port );
2366
-
2367
- if (!port -> slave ) {
2368
- net_warn_ratelimited ("%s: Warning: port of slave %s is uninitialized\n" ,
2369
- slave -> dev -> name , slave -> bond -> dev -> name );
2370
- return ret ;
2371
- }
2382
+ port = & (SLAVE_AD_INFO (slave )-> port );
2383
+ if (!port -> slave ) {
2384
+ net_warn_ratelimited ("%s: Warning: port of slave %s is uninitialized\n" ,
2385
+ slave -> dev -> name , slave -> bond -> dev -> name );
2386
+ return ret ;
2387
+ }
2372
2388
2373
- switch (lacpdu -> subtype ) {
2374
- case AD_TYPE_LACPDU :
2375
- ret = RX_HANDLER_CONSUMED ;
2376
- netdev_dbg (slave -> bond -> dev ,
2377
- "Received LACPDU on port %d slave %s\n" ,
2378
- port -> actor_port_number ,
2379
- slave -> dev -> name );
2380
- /* Protect against concurrent state machines */
2381
- spin_lock (& slave -> bond -> mode_lock );
2382
- ad_rx_machine (lacpdu , port );
2383
- spin_unlock (& slave -> bond -> mode_lock );
2389
+ switch (lacpdu -> subtype ) {
2390
+ case AD_TYPE_LACPDU :
2391
+ ret = RX_HANDLER_CONSUMED ;
2392
+ netdev_dbg (slave -> bond -> dev ,
2393
+ "Received LACPDU on port %d slave %s\n" ,
2394
+ port -> actor_port_number , slave -> dev -> name );
2395
+ /* Protect against concurrent state machines */
2396
+ spin_lock (& slave -> bond -> mode_lock );
2397
+ ad_rx_machine (lacpdu , port );
2398
+ spin_unlock (& slave -> bond -> mode_lock );
2399
+ break ;
2400
+ case AD_TYPE_MARKER :
2401
+ ret = RX_HANDLER_CONSUMED ;
2402
+ /* No need to convert fields to Little Endian since we
2403
+ * don't use the marker's fields.
2404
+ */
2405
+ marker = (struct bond_marker * )lacpdu ;
2406
+ switch (marker -> tlv_type ) {
2407
+ case AD_MARKER_INFORMATION_SUBTYPE :
2408
+ netdev_dbg (slave -> bond -> dev , "Received Marker Information on port %d\n" ,
2409
+ port -> actor_port_number );
2410
+ ad_marker_info_received (marker , port );
2384
2411
break ;
2385
-
2386
- case AD_TYPE_MARKER :
2387
- ret = RX_HANDLER_CONSUMED ;
2388
- /* No need to convert fields to Little Endian since we
2389
- * don't use the marker's fields.
2390
- */
2391
-
2392
- switch (((struct bond_marker * )lacpdu )-> tlv_type ) {
2393
- case AD_MARKER_INFORMATION_SUBTYPE :
2394
- netdev_dbg (slave -> bond -> dev , "Received Marker Information on port %d\n" ,
2395
- port -> actor_port_number );
2396
- ad_marker_info_received ((struct bond_marker * )lacpdu , port );
2397
- break ;
2398
-
2399
- case AD_MARKER_RESPONSE_SUBTYPE :
2400
- netdev_dbg (slave -> bond -> dev , "Received Marker Response on port %d\n" ,
2401
- port -> actor_port_number );
2402
- ad_marker_response_received ((struct bond_marker * )lacpdu , port );
2403
- break ;
2404
-
2405
- default :
2406
- netdev_dbg (slave -> bond -> dev , "Received an unknown Marker subtype on slot %d\n" ,
2407
- port -> actor_port_number );
2408
- }
2412
+ case AD_MARKER_RESPONSE_SUBTYPE :
2413
+ netdev_dbg (slave -> bond -> dev , "Received Marker Response on port %d\n" ,
2414
+ port -> actor_port_number );
2415
+ ad_marker_response_received (marker , port );
2416
+ break ;
2417
+ default :
2418
+ netdev_dbg (slave -> bond -> dev , "Received an unknown Marker subtype on slot %d\n" ,
2419
+ port -> actor_port_number );
2420
+ stat = & SLAVE_AD_INFO (slave )-> stats .marker_unknown_rx ;
2421
+ atomic64_inc (stat );
2409
2422
}
2423
+ break ;
2424
+ default :
2425
+ atomic64_inc (& SLAVE_AD_INFO (slave )-> stats .lacpdu_unknown_rx );
2410
2426
}
2427
+
2411
2428
return ret ;
2412
2429
}
2413
2430
@@ -2643,10 +2660,12 @@ int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
2643
2660
return RX_HANDLER_ANOTHER ;
2644
2661
2645
2662
lacpdu = skb_header_pointer (skb , 0 , sizeof (_lacpdu ), & _lacpdu );
2646
- if (!lacpdu )
2663
+ if (!lacpdu ) {
2664
+ atomic64_inc (& SLAVE_AD_INFO (slave )-> stats .lacpdu_illegal_rx );
2647
2665
return RX_HANDLER_ANOTHER ;
2666
+ }
2648
2667
2649
- return bond_3ad_rx_indication (lacpdu , slave , skb -> len );
2668
+ return bond_3ad_rx_indication (lacpdu , slave );
2650
2669
}
2651
2670
2652
2671
/**
@@ -2678,3 +2697,85 @@ void bond_3ad_update_lacp_rate(struct bonding *bond)
2678
2697
}
2679
2698
spin_unlock_bh (& bond -> mode_lock );
2680
2699
}
2700
+
2701
+ void bond_3ad_stats_add (struct slave * slave , struct bond_3ad_stats * stats )
2702
+ {
2703
+ struct bond_3ad_stats * rstats = & SLAVE_AD_INFO (slave )-> stats ;
2704
+ u64 stat ;
2705
+
2706
+ atomic64_add (atomic64_read (& rstats -> lacpdu_rx ), & stats -> lacpdu_rx );
2707
+ atomic64_add (atomic64_read (& rstats -> lacpdu_tx ), & stats -> lacpdu_tx );
2708
+
2709
+ stat = atomic64_read (& rstats -> lacpdu_unknown_rx );
2710
+ atomic64_add (stat , & stats -> lacpdu_unknown_rx );
2711
+ stat = atomic64_read (& rstats -> lacpdu_illegal_rx );
2712
+ atomic64_add (stat , & stats -> lacpdu_illegal_rx );
2713
+
2714
+ atomic64_add (atomic64_read (& rstats -> marker_rx ), & stats -> marker_rx );
2715
+ atomic64_add (atomic64_read (& rstats -> marker_tx ), & stats -> marker_tx );
2716
+
2717
+ stat = atomic64_read (& rstats -> marker_resp_rx );
2718
+ atomic64_add (stat , & stats -> marker_resp_rx );
2719
+ stat = atomic64_read (& rstats -> marker_resp_tx );
2720
+ atomic64_add (stat , & stats -> marker_resp_tx );
2721
+ stat = atomic64_read (& rstats -> marker_unknown_rx );
2722
+ atomic64_add (stat , & stats -> marker_unknown_rx );
2723
+ }
2724
+
2725
+ size_t bond_3ad_stats_size (void )
2726
+ {
2727
+ return nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_LACPDU_RX */
2728
+ nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_LACPDU_TX */
2729
+ nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_LACPDU_UNKNOWN_RX */
2730
+ nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_LACPDU_ILLEGAL_RX */
2731
+ nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_MARKER_RX */
2732
+ nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_MARKER_TX */
2733
+ nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_MARKER_RESP_RX */
2734
+ nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_MARKER_RESP_TX */
2735
+ nla_total_size_64bit (sizeof (u64 )); /* BOND_3AD_STAT_MARKER_UNKNOWN_RX */
2736
+ }
2737
+
2738
+ int bond_3ad_stats_fill (struct sk_buff * skb , struct bond_3ad_stats * stats )
2739
+ {
2740
+ u64 val ;
2741
+
2742
+ val = atomic64_read (& stats -> lacpdu_rx );
2743
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_LACPDU_RX , val ,
2744
+ BOND_3AD_STAT_PAD ))
2745
+ return - EMSGSIZE ;
2746
+ val = atomic64_read (& stats -> lacpdu_tx );
2747
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_LACPDU_TX , val ,
2748
+ BOND_3AD_STAT_PAD ))
2749
+ return - EMSGSIZE ;
2750
+ val = atomic64_read (& stats -> lacpdu_unknown_rx );
2751
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_LACPDU_UNKNOWN_RX , val ,
2752
+ BOND_3AD_STAT_PAD ))
2753
+ return - EMSGSIZE ;
2754
+ val = atomic64_read (& stats -> lacpdu_illegal_rx );
2755
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_LACPDU_ILLEGAL_RX , val ,
2756
+ BOND_3AD_STAT_PAD ))
2757
+ return - EMSGSIZE ;
2758
+
2759
+ val = atomic64_read (& stats -> marker_rx );
2760
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_MARKER_RX , val ,
2761
+ BOND_3AD_STAT_PAD ))
2762
+ return - EMSGSIZE ;
2763
+ val = atomic64_read (& stats -> marker_tx );
2764
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_MARKER_TX , val ,
2765
+ BOND_3AD_STAT_PAD ))
2766
+ return - EMSGSIZE ;
2767
+ val = atomic64_read (& stats -> marker_resp_rx );
2768
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_MARKER_RESP_RX , val ,
2769
+ BOND_3AD_STAT_PAD ))
2770
+ return - EMSGSIZE ;
2771
+ val = atomic64_read (& stats -> marker_resp_tx );
2772
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_MARKER_RESP_TX , val ,
2773
+ BOND_3AD_STAT_PAD ))
2774
+ return - EMSGSIZE ;
2775
+ val = atomic64_read (& stats -> marker_unknown_rx );
2776
+ if (nla_put_u64_64bit (skb , BOND_3AD_STAT_MARKER_UNKNOWN_RX , val ,
2777
+ BOND_3AD_STAT_PAD ))
2778
+ return - EMSGSIZE ;
2779
+
2780
+ return 0 ;
2781
+ }
0 commit comments