On 6/21/19 9:41 PM, Jon Maloy wrote:
> Hi Ying,
> We discussed this, and even had a first version where we did this, performing 
> the whole attach/detach tasks in the command execution itself. This resulted 
> in way to much new code to my taste. 
> My greatest concern now is that some users will enable this interface because 
> they think it is necessary (we have already seen cases of that) and then 
> start complaining about performance.
> So, as a compromise, I suggested we could add a "confirmation" printout in 
> the tipc tool when the loopback interface is enabled, to make the user 
> understand that this is for tracing only.
> Do you think this would be acceptable?

Make sense to me.

Thanks,
Ying

> 
> ///jon
> 
> 
>> -----Original Message-----
>> From: Ying Xue <ying....@windriver.com>
>> Sent: 21-Jun-19 08:16
>> To: John Rutherford <john.rutherf...@dektech.com.au>; tipc-
>> discuss...@lists.sourceforge.net
>> Subject: Re: [tipc-discussion] [net-next v2] tipc: add loopback device 
>> tracking
>>
>> Good work!
>>
>> Just one suggestion: it's better to add one separate kernel config to control
>> whether the new feature is enabled or not, and its default value should be 
>> set
>> to "Disabled" because the feature is related to debug.
>>
>> On 6/19/19 8:11 AM, John Rutherford wrote:
>>> Since node internal messages are passed directly to socket it is not
>>> possible to observe this message exchange via tcpdump or wireshark.
>>>
>>> We now remedy this by making it possible to clone such messages and
>>> send the clones to the loopback interface.  The clones are dropped at
>>> reception and have no functional role except making the traffic visible.
>>>
>>> The feature is turned on/off by enabling/disabling the loopback "bearer"
>>> "eth:lo".
>>>
>>> Signed-off-by: John Rutherford <john.rutherf...@dektech.com.au>
>>> ---
>>>  net/tipc/bcast.c  |  4 +++-
>>>  net/tipc/bearer.c | 67
>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>  net/tipc/bearer.h |  3 +++
>>>  net/tipc/core.c   |  5 ++++-
>>>  net/tipc/core.h   | 12 ++++++++++
>>>  net/tipc/node.c   |  1 +
>>>  net/tipc/topsrv.c |  2 ++
>>>  7 files changed, 92 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index
>>> 6c997d4..235331d 100644
>>> --- a/net/tipc/bcast.c
>>> +++ b/net/tipc/bcast.c
>>> @@ -406,8 +406,10 @@ int tipc_mcast_xmit(struct net *net, struct
>> sk_buff_head *pkts,
>>>                     rc = tipc_bcast_xmit(net, pkts, cong_link_cnt);
>>>     }
>>>
>>> -   if (dests->local)
>>> +   if (dests->local) {
>>> +           tipc_loopback_trace(net, &localq);
>>>             tipc_sk_mcast_rcv(net, &localq, &inputq);
>>> +   }
>>>  exit:
>>>     /* This queue should normally be empty by now */
>>>     __skb_queue_purge(pkts);
>>> diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index
>>> 2bed658..27b4fd7 100644
>>> --- a/net/tipc/bearer.c
>>> +++ b/net/tipc/bearer.c
>>> @@ -836,6 +836,12 @@ int __tipc_nl_bearer_disable(struct sk_buff *skb,
>>> struct genl_info *info)
>>>
>>>     name = nla_data(attrs[TIPC_NLA_BEARER_NAME]);
>>>
>>> +   if (!strcmp(name, "eth:lo")) {
>>> +           tipc_net(net)->loopback_trace = false;
>>> +           pr_info("Disabled packet tracing on loopback interface\n");
>>> +           return 0;
>>> +   }
>>> +
>>>     bearer = tipc_bearer_find(net, name);
>>>     if (!bearer)
>>>             return -EINVAL;
>>> @@ -881,6 +887,12 @@ int __tipc_nl_bearer_enable(struct sk_buff *skb,
>>> struct genl_info *info)
>>>
>>>     bearer = nla_data(attrs[TIPC_NLA_BEARER_NAME]);
>>>
>>> +   if (!strcmp(bearer, "eth:lo")) {
>>> +           tipc_net(net)->loopback_trace = true;
>>> +           pr_info("Enabled packet tracing on loopback interface\n");
>>> +           return 0;
>>> +   }
>>> +
>>>     if (attrs[TIPC_NLA_BEARER_DOMAIN])
>>>             domain = nla_get_u32(attrs[TIPC_NLA_BEARER_DOMAIN]);
>>>
>>> @@ -1021,6 +1033,61 @@ int tipc_nl_bearer_set(struct sk_buff *skb,
>> struct genl_info *info)
>>>     return err;
>>>  }
>>>
>>> +void tipc_clone_to_loopback(struct net *net, struct sk_buff_head
>>> +*xmitq) {
>>> +   struct net_device *dev = net->loopback_dev;
>>> +   struct sk_buff *skb, *_skb;
>>> +   int exp;
>>> +
>>> +   skb_queue_walk(xmitq, _skb) {
>>> +           skb = pskb_copy(_skb, GFP_ATOMIC);
>>> +           if (!skb)
>>> +                   continue;
>>> +           exp = SKB_DATA_ALIGN(dev->hard_header_len -
>> skb_headroom(skb));
>>> +           if (exp > 0 && pskb_expand_head(skb, exp, 0, GFP_ATOMIC)) {
>>> +                   kfree_skb(skb);
>>> +                   continue;
>>> +           }
>>> +           skb_reset_network_header(skb);
>>> +           skb->dev = dev;
>>> +           skb->protocol = htons(ETH_P_TIPC);
>>> +           dev_hard_header(skb, dev, ETH_P_TIPC, dev->dev_addr,
>>> +                           dev->dev_addr, skb->len);
>>> +           dev_queue_xmit(skb);
>>> +   }
>>> +}
>>> +
>>> +static int tipc_loopback_rcv_pkt(struct sk_buff *skb, struct net_device
>> *dev,
>>> +                            struct packet_type *pt, struct net_device *od) 
>>> {
>>> +   consume_skb(skb);
>>> +   return NET_RX_SUCCESS;
>>> +}
>>> +
>>> +int tipc_attach_loopback(struct net *net) {
>>> +   struct net_device *dev = net->loopback_dev;
>>> +   struct tipc_net *tn = tipc_net(net);
>>> +
>>> +   if (!dev)
>>> +           return -ENODEV;
>>> +   dev_hold(dev);
>>> +   tn->loopback_pt.dev = dev;
>>> +   tn->loopback_pt.type = htons(ETH_P_TIPC);
>>> +   tn->loopback_pt.func = tipc_loopback_rcv_pkt;
>>> +   tn->loopback_trace = false;
>>> +   dev_add_pack(&tn->loopback_pt);
>>> +   return 0;
>>> +}
>>> +
>>> +void tipc_detach_loopback(struct net *net) {
>>> +   struct tipc_net *tn = tipc_net(net);
>>> +
>>> +   dev_remove_pack(&tn->loopback_pt);
>>> +   dev_put(net->loopback_dev);
>>> +}
>>> +
>>>  static int __tipc_nl_add_media(struct tipc_nl_msg *msg,
>>>                            struct tipc_media *media, int nlflags)  { diff 
>>> --git
>>> a/net/tipc/bearer.h b/net/tipc/bearer.h index 7f4c569..ef7fad9 100644
>>> --- a/net/tipc/bearer.h
>>> +++ b/net/tipc/bearer.h
>>> @@ -232,6 +232,9 @@ void tipc_bearer_xmit(struct net *net, u32
>> bearer_id,
>>>                   struct tipc_media_addr *dst);  void
>>> tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
>>>                      struct sk_buff_head *xmitq);
>>> +void tipc_clone_to_loopback(struct net *net, struct sk_buff_head
>>> +*xmitq); int tipc_attach_loopback(struct net *net); void
>>> +tipc_detach_loopback(struct net *net);
>>>
>>>  /* check if device MTU is too low for tipc headers */  static inline
>>> bool tipc_mtu_bad(struct net_device *dev, unsigned int reserve) diff
>>> --git a/net/tipc/core.c b/net/tipc/core.c index ed536c0..1867687
>>> 100644
>>> --- a/net/tipc/core.c
>>> +++ b/net/tipc/core.c
>>> @@ -81,7 +81,9 @@ static int __net_init tipc_init_net(struct net *net)
>>>     err = tipc_bcast_init(net);
>>>     if (err)
>>>             goto out_bclink;
>>> -
>>> +   err = tipc_attach_loopback(net);
>>> +   if (err)
>>> +           goto out_bclink;
>>>     return 0;
>>>
>>>  out_bclink:
>>> @@ -94,6 +96,7 @@ static int __net_init tipc_init_net(struct net *net)
>>>
>>>  static void __net_exit tipc_exit_net(struct net *net)  {
>>> +   tipc_detach_loopback(net);
>>>     tipc_net_stop(net);
>>>     tipc_bcast_stop(net);
>>>     tipc_nametbl_stop(net);
>>> diff --git a/net/tipc/core.h b/net/tipc/core.h index 7a68e1b..c1c2906
>>> 100644
>>> --- a/net/tipc/core.h
>>> +++ b/net/tipc/core.h
>>> @@ -67,6 +67,7 @@ struct tipc_link;
>>>  struct tipc_name_table;
>>>  struct tipc_topsrv;
>>>  struct tipc_monitor;
>>> +void tipc_clone_to_loopback(struct net *net, struct sk_buff_head
>>> +*pkts);
>>>
>>>  #define TIPC_MOD_VER "2.0.0"
>>>
>>> @@ -125,6 +126,10 @@ struct tipc_net {
>>>
>>>     /* Cluster capabilities */
>>>     u16 capabilities;
>>> +
>>> +   /* Tracing of node internal messages */
>>> +   struct packet_type loopback_pt;
>>> +   bool loopback_trace;
>>>  };
>>>
>>>  static inline struct tipc_net *tipc_net(struct net *net) @@ -152,6
>>> +157,13 @@ static inline struct tipc_topsrv *tipc_topsrv(struct net *net)
>>>     return tipc_net(net)->topsrv;
>>>  }
>>>
>>> +static inline void tipc_loopback_trace(struct net *net,
>>> +                                  struct sk_buff_head *pkts) {
>>> +   if (unlikely(tipc_net(net)->loopback_trace))
>>> +           tipc_clone_to_loopback(net, pkts);
>>> +}
>>> +
>>>  static inline unsigned int tipc_hashfn(u32 addr)  {
>>>     return addr & (NODE_HTABLE_SIZE - 1); diff --git a/net/tipc/node.c
>>> b/net/tipc/node.c index 9e106d3..7e58831 100644
>>> --- a/net/tipc/node.c
>>> +++ b/net/tipc/node.c
>>> @@ -1439,6 +1439,7 @@ int tipc_node_xmit(struct net *net, struct
>> sk_buff_head *list,
>>>     int rc;
>>>
>>>     if (in_own_node(net, dnode)) {
>>> +           tipc_loopback_trace(net, list);
>>>             tipc_sk_rcv(net, list);
>>>             return 0;
>>>     }
>>> diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c index
>>> f345662..e3a6ba1 100644
>>> --- a/net/tipc/topsrv.c
>>> +++ b/net/tipc/topsrv.c
>>> @@ -40,6 +40,7 @@
>>>  #include "socket.h"
>>>  #include "addr.h"
>>>  #include "msg.h"
>>> +#include "bearer.h"
>>>  #include <net/sock.h>
>>>  #include <linux/module.h>
>>>
>>> @@ -608,6 +609,7 @@ static void tipc_topsrv_kern_evt(struct net *net,
>> struct tipc_event *evt)
>>>     memcpy(msg_data(buf_msg(skb)), evt, sizeof(*evt));
>>>     skb_queue_head_init(&evtq);
>>>     __skb_queue_tail(&evtq, skb);
>>> +   tipc_loopback_trace(net, &evtq);
>>>     tipc_sk_rcv(net, &evtq);
>>>  }
>>>
>>>
>>
>>
>> _______________________________________________
>> tipc-discussion mailing list
>> tipc-discussion@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/tipc-discussion
> 


_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to