Repository : ssh://git@open-mesh.org/batman-adv
On branch : master
commit b996a44739b3340d9e651c556e434d2524ec145f Author: Martin Hundebøll martin@hundeboll.net Date: Fri Apr 20 17:02:45 2012 +0200
batman-adv: Add get_ethtool_stats() support for DAT
Added additional counters for D.A.T.
Signed-off-by: Martin Hundebøll martin@hundeboll.net Signed-off-by: Antonio Quartulli ordex@autistici.org
b996a44739b3340d9e651c556e434d2524ec145f distributed-arp-table.c | 19 +++++++++++++++++-- distributed-arp-table.h | 27 +++++++++++++++++++++++++++ routing.c | 8 +++++++- soft-interface.c | 7 +++++++ types.h | 7 +++++++ 5 files changed, 65 insertions(+), 3 deletions(-)
diff --git a/distributed-arp-table.c b/distributed-arp-table.c index d637d62..c933615 100644 --- a/distributed-arp-table.c +++ b/distributed-arp-table.c @@ -601,9 +601,22 @@ static bool batadv_dat_send_data(struct batadv_priv *bat_priv, send_status = batadv_send_skb_packet(tmp_skb, neigh_node->if_incoming, neigh_node->addr); - if (send_status == NET_XMIT_SUCCESS) + if (send_status == NET_XMIT_SUCCESS) { + /* count the sent packet */ + switch (packet_subtype) { + case BATADV_P_DAT_DHT_GET: + batadv_inc_counter(bat_priv, + BATADV_CNT_DAT_GET_TX); + break; + case BATADV_P_DAT_DHT_PUT: + batadv_inc_counter(bat_priv, + BATADV_CNT_DAT_PUT_TX); + break; + } + /* packet sent to a candidate: return true */ ret = true; + } free_neigh: batadv_neigh_node_free_ref(neigh_node); free_orig: @@ -906,8 +919,10 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv, else err = batadv_unicast_send_skb(bat_priv, skb_new);
- if (!err) + if (!err) { + batadv_inc_counter(bat_priv, BATADV_CNT_DAT_CACHED_REPLY_TX); ret = true; + } out: if (dat_entry) batadv_dat_entry_free_ref(dat_entry); diff --git a/distributed-arp-table.h b/distributed-arp-table.h index abdae59..22dd983 100644 --- a/distributed-arp-table.h +++ b/distributed-arp-table.h @@ -75,6 +75,28 @@ void batadv_dat_free(struct batadv_priv *bat_priv); int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset); void batadv_dat_switch(struct net_device *net_dev);
+/** + * batadv_dat_inc_counter - increment the correct DAT packet counter + * @bat_priv: the bat priv with all the soft interface information + * @subtype: the 4addr subtype of the packet to be counted + * + * Updates the ethtool statistics for the received packet if it is a DAT subtype + */ +static inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv, + uint8_t subtype) +{ + switch (subtype) { + case BATADV_P_DAT_DHT_GET: + batadv_inc_counter(bat_priv, + BATADV_CNT_DAT_GET_RX); + break; + case BATADV_P_DAT_DHT_PUT: + batadv_inc_counter(bat_priv, + BATADV_CNT_DAT_PUT_RX); + break; + } +} + #else
static inline bool @@ -136,6 +158,11 @@ static inline void batadv_dat_free(struct batadv_priv *bat_priv) { }
+static inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv, + uint8_t subtype) +{ +} + #endif /* CONFIG_BATMAN_ADV_DAT */
#endif /* _NET_BATMAN_ADV_ARP_H_ */ diff --git a/routing.c b/routing.c index 74e97eb..12af7d3 100644 --- a/routing.c +++ b/routing.c @@ -1041,15 +1041,17 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, { struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface); struct batadv_unicast_packet *unicast_packet; + struct batadv_unicast_4addr_packet *unicast_4addr_packet; int hdr_size = sizeof(*unicast_packet); bool is4addr;
unicast_packet = (struct batadv_unicast_packet *)skb->data; + unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
is4addr = unicast_packet->header.packet_type == BATADV_UNICAST_4ADDR; /* the caller function should have already pulled 2 bytes */ if (is4addr) - hdr_size = sizeof(struct batadv_unicast_4addr_packet); + hdr_size = sizeof(*unicast_4addr_packet);
if (batadv_check_unicast_packet(skb, hdr_size) < 0) return NET_RX_DROP; @@ -1066,6 +1068,10 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, hdr_size)) goto rx_success;
+ if (is4addr) + batadv_dat_inc_counter(bat_priv, + unicast_4addr_packet->subtype); + batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size, NULL);
diff --git a/soft-interface.c b/soft-interface.c index c94bccc..2d1f895 100644 --- a/soft-interface.c +++ b/soft-interface.c @@ -624,6 +624,13 @@ static const struct { { "tt_response_rx" }, { "tt_roam_adv_tx" }, { "tt_roam_adv_rx" }, +#ifdef CONFIG_BATMAN_ADV_DAT + { "dat_get_tx" }, + { "dat_get_rx" }, + { "dat_put_tx" }, + { "dat_put_rx" }, + { "dat_cached_reply_tx" }, +#endif };
static void batadv_get_strings(struct net_device *dev, uint32_t stringset, diff --git a/types.h b/types.h index 6e81dcd..b1c261b 100644 --- a/types.h +++ b/types.h @@ -179,6 +179,13 @@ enum batadv_counters { BATADV_CNT_TT_RESPONSE_RX, BATADV_CNT_TT_ROAM_ADV_TX, BATADV_CNT_TT_ROAM_ADV_RX, +#ifdef CONFIG_BATMAN_ADV_DAT + BATADV_CNT_DAT_GET_TX, + BATADV_CNT_DAT_GET_RX, + BATADV_CNT_DAT_PUT_TX, + BATADV_CNT_DAT_PUT_RX, + BATADV_CNT_DAT_CACHED_REPLY_TX, +#endif BATADV_CNT_NUM, };