@@ -15,19 +15,46 @@ struct stats_req_info {
1515struct stats_reply_data {
1616 struct ethnl_reply_data base ;
1717 struct ethtool_eth_phy_stats phy_stats ;
18+ struct ethtool_eth_mac_stats mac_stats ;
1819};
1920
2021#define STATS_REPDATA (__reply_base ) \
2122 container_of(__reply_base, struct stats_reply_data, base)
2223
2324const char stats_std_names [__ETHTOOL_STATS_CNT ][ETH_GSTRING_LEN ] = {
2425 [ETHTOOL_STATS_ETH_PHY ] = "eth-phy" ,
26+ [ETHTOOL_STATS_ETH_MAC ] = "eth-mac" ,
2527};
2628
2729const char stats_eth_phy_names [__ETHTOOL_A_STATS_ETH_PHY_CNT ][ETH_GSTRING_LEN ] = {
2830 [ETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR ] = "SymbolErrorDuringCarrier" ,
2931};
3032
33+ const char stats_eth_mac_names [__ETHTOOL_A_STATS_ETH_MAC_CNT ][ETH_GSTRING_LEN ] = {
34+ [ETHTOOL_A_STATS_ETH_MAC_2_TX_PKT ] = "FramesTransmittedOK" ,
35+ [ETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL ] = "SingleCollisionFrames" ,
36+ [ETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL ] = "MultipleCollisionFrames" ,
37+ [ETHTOOL_A_STATS_ETH_MAC_5_RX_PKT ] = "FramesReceivedOK" ,
38+ [ETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR ] = "FrameCheckSequenceErrors" ,
39+ [ETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR ] = "AlignmentErrors" ,
40+ [ETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES ] = "OctetsTransmittedOK" ,
41+ [ETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER ] = "FramesWithDeferredXmissions" ,
42+ [ETHTOOL_A_STATS_ETH_MAC_10_LATE_COL ] = "LateCollisions" ,
43+ [ETHTOOL_A_STATS_ETH_MAC_11_XS_COL ] = "FramesAbortedDueToXSColls" ,
44+ [ETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR ] = "FramesLostDueToIntMACXmitError" ,
45+ [ETHTOOL_A_STATS_ETH_MAC_13_CS_ERR ] = "CarrierSenseErrors" ,
46+ [ETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES ] = "OctetsReceivedOK" ,
47+ [ETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR ] = "FramesLostDueToIntMACRcvError" ,
48+ [ETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST ] = "MulticastFramesXmittedOK" ,
49+ [ETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST ] = "BroadcastFramesXmittedOK" ,
50+ [ETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER ] = "FramesWithExcessiveDeferral" ,
51+ [ETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST ] = "MulticastFramesReceivedOK" ,
52+ [ETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST ] = "BroadcastFramesReceivedOK" ,
53+ [ETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR ] = "InRangeLengthErrors" ,
54+ [ETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN ] = "OutOfRangeLengthField" ,
55+ [ETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR ] = "FrameTooLongErrors" ,
56+ };
57+
3158const struct nla_policy ethnl_stats_get_policy [ETHTOOL_A_STATS_GROUPS + 1 ] = {
3259 [ETHTOOL_A_STATS_HEADER ] =
3360 NLA_POLICY_NESTED (ethnl_header_policy ),
@@ -70,10 +97,14 @@ static int stats_prepare_data(const struct ethnl_req_info *req_base,
7097 return ret ;
7198
7299 memset (& data -> phy_stats , 0xff , sizeof (data -> phy_stats ));
100+ memset (& data -> mac_stats , 0xff , sizeof (data -> mac_stats ));
73101
74102 if (test_bit (ETHTOOL_STATS_ETH_PHY , req_info -> stat_mask ) &&
75103 dev -> ethtool_ops -> get_eth_phy_stats )
76104 dev -> ethtool_ops -> get_eth_phy_stats (dev , & data -> phy_stats );
105+ if (test_bit (ETHTOOL_STATS_ETH_MAC , req_info -> stat_mask ) &&
106+ dev -> ethtool_ops -> get_eth_mac_stats )
107+ dev -> ethtool_ops -> get_eth_mac_stats (dev , & data -> mac_stats );
77108
78109 ethnl_ops_complete (dev );
79110 return 0 ;
@@ -90,6 +121,10 @@ static int stats_reply_size(const struct ethnl_req_info *req_base,
90121 n_stats += sizeof (struct ethtool_eth_phy_stats ) / sizeof (u64 );
91122 n_grps ++ ;
92123 }
124+ if (test_bit (ETHTOOL_STATS_ETH_MAC , req_info -> stat_mask )) {
125+ n_stats += sizeof (struct ethtool_eth_mac_stats ) / sizeof (u64 );
126+ n_grps ++ ;
127+ }
93128
94129 len += n_grps * (nla_total_size (0 ) + /* _A_STATS_GRP */
95130 nla_total_size (4 ) + /* _A_STATS_GRP_ID */
@@ -143,6 +178,57 @@ static int stats_put_phy_stats(struct sk_buff *skb,
143178 return 0 ;
144179}
145180
181+ static int stats_put_mac_stats (struct sk_buff * skb ,
182+ const struct stats_reply_data * data )
183+ {
184+ if (stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_2_TX_PKT ,
185+ data -> mac_stats .FramesTransmittedOK ) ||
186+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL ,
187+ data -> mac_stats .SingleCollisionFrames ) ||
188+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL ,
189+ data -> mac_stats .MultipleCollisionFrames ) ||
190+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_5_RX_PKT ,
191+ data -> mac_stats .FramesReceivedOK ) ||
192+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR ,
193+ data -> mac_stats .FrameCheckSequenceErrors ) ||
194+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR ,
195+ data -> mac_stats .AlignmentErrors ) ||
196+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES ,
197+ data -> mac_stats .OctetsTransmittedOK ) ||
198+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER ,
199+ data -> mac_stats .FramesWithDeferredXmissions ) ||
200+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_10_LATE_COL ,
201+ data -> mac_stats .LateCollisions ) ||
202+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_11_XS_COL ,
203+ data -> mac_stats .FramesAbortedDueToXSColls ) ||
204+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR ,
205+ data -> mac_stats .FramesLostDueToIntMACXmitError ) ||
206+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_13_CS_ERR ,
207+ data -> mac_stats .CarrierSenseErrors ) ||
208+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES ,
209+ data -> mac_stats .OctetsReceivedOK ) ||
210+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR ,
211+ data -> mac_stats .FramesLostDueToIntMACRcvError ) ||
212+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST ,
213+ data -> mac_stats .MulticastFramesXmittedOK ) ||
214+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST ,
215+ data -> mac_stats .BroadcastFramesXmittedOK ) ||
216+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER ,
217+ data -> mac_stats .FramesWithExcessiveDeferral ) ||
218+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST ,
219+ data -> mac_stats .MulticastFramesReceivedOK ) ||
220+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST ,
221+ data -> mac_stats .BroadcastFramesReceivedOK ) ||
222+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR ,
223+ data -> mac_stats .InRangeLengthErrors ) ||
224+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN ,
225+ data -> mac_stats .OutOfRangeLengthField ) ||
226+ stat_put (skb , ETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR ,
227+ data -> mac_stats .FrameTooLongErrors ))
228+ return - EMSGSIZE ;
229+ return 0 ;
230+ }
231+
146232static int stats_put_stats (struct sk_buff * skb ,
147233 const struct stats_reply_data * data ,
148234 u32 id , u32 ss_id ,
@@ -182,6 +268,10 @@ static int stats_fill_reply(struct sk_buff *skb,
182268 ret = stats_put_stats (skb , data , ETHTOOL_STATS_ETH_PHY ,
183269 ETH_SS_STATS_ETH_PHY ,
184270 stats_put_phy_stats );
271+ if (!ret && test_bit (ETHTOOL_STATS_ETH_MAC , req_info -> stat_mask ))
272+ ret = stats_put_stats (skb , data , ETHTOOL_STATS_ETH_MAC ,
273+ ETH_SS_STATS_ETH_MAC ,
274+ stats_put_mac_stats );
185275
186276 return ret ;
187277}
0 commit comments