On Tue, Feb 12, 2019 at 11:07 PM Eric Dumazet <eric.duma...@gmail.com> wrote: > > > > On 02/12/2019 03:31 AM, Yafang Shao wrote: > > SOCK_DEBUG is a very ancient debugging interface, and it's not very useful > > for debugging. > > So this patch removes the SOCK_DEBUG() and introduce a new function > > tcp_stats() to trace this kind of events. > > Some MIBs are added for these events. > > > > Regarding the SO_DEBUG in sock_{s,g}etsockopt, I think it is better to > > keep as-is, because if we return an errno to tell the application that > > this optname isn't supported for TCP, it may break the application. > > The application still can use this option but don't take any effect for > > TCP. > > > > Signed-off-by: Yafang Shao <laoar.s...@gmail.com> > > --- > > include/uapi/linux/snmp.h | 3 +++ > > net/ipv4/proc.c | 3 +++ > > net/ipv4/tcp_input.c | 26 +++++++++++--------------- > > net/ipv6/tcp_ipv6.c | 2 -- > > 4 files changed, 17 insertions(+), 17 deletions(-) > > > > diff --git a/include/uapi/linux/snmp.h b/include/uapi/linux/snmp.h > > index 86dc24a..fd5c09c 100644 > > --- a/include/uapi/linux/snmp.h > > +++ b/include/uapi/linux/snmp.h > > @@ -283,6 +283,9 @@ enum > > LINUX_MIB_TCPACKCOMPRESSED, /* TCPAckCompressed */ > > LINUX_MIB_TCPZEROWINDOWDROP, /* TCPZeroWindowDrop */ > > LINUX_MIB_TCPRCVQDROP, /* TCPRcvQDrop */ > > + LINUX_MIB_TCPINVALIDACK, /* TCPInvalidAck */ > > + LINUX_MIB_TCPOLDACK, /* TCPOldAck */ > > + LINUX_MIB_TCPPARTIALPACKET, /* TCPPartialPacket */ > > __LINUX_MIB_MAX > > }; > > > > diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c > > index c3610b3..1b0320a 100644 > > --- a/net/ipv4/proc.c > > +++ b/net/ipv4/proc.c > > @@ -291,6 +291,9 @@ static int sockstat_seq_show(struct seq_file *seq, void > > *v) > > SNMP_MIB_ITEM("TCPAckCompressed", LINUX_MIB_TCPACKCOMPRESSED), > > SNMP_MIB_ITEM("TCPZeroWindowDrop", LINUX_MIB_TCPZEROWINDOWDROP), > > SNMP_MIB_ITEM("TCPRcvQDrop", LINUX_MIB_TCPRCVQDROP), > > + SNMP_MIB_ITEM("TCPInvalidAck", LINUX_MIB_TCPINVALIDACK), > > + SNMP_MIB_ITEM("TCPOldAck", LINUX_MIB_TCPOLDACK), > > + SNMP_MIB_ITEM("TCPPartialPacket", LINUX_MIB_TCPPARTIALPACKET), > > SNMP_MIB_SENTINEL > > }; > > > > diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c > > index 7a027dec..88deb1f 100644 > > --- a/net/ipv4/tcp_input.c > > +++ b/net/ipv4/tcp_input.c > > @@ -3554,6 +3554,11 @@ static u32 tcp_newly_delivered(struct sock *sk, u32 > > prior_delivered, int flag) > > return delivered; > > } > > > > +static void tcp_stats(struct sock *sk, int mib_idx) > > +{ > > + NET_INC_STATS(sock_net(sk), mib_idx); > > +} > > This is not a very descriptive name. > > Why is it static, and in net/ipv4/tcp_input.c ??? >
Because it is only called in net/ipv4/tcp_input.c currently, so I define it as static in this file, the reseaon I don't define it as 'static inline' is that I think the compiler can make a better decision than me. In the future it may be called in other files, then we can put it into a more proper file. > > + > > /* This routine deals with incoming acks, but not outgoing ones. */ > > static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) > > { > > @@ -3715,7 +3720,7 @@ static int tcp_ack(struct sock *sk, const struct > > sk_buff *skb, int flag) > > return 1; > > > > invalid_ack: > > - SOCK_DEBUG(sk, "Ack %u after %u:%u\n", ack, tp->snd_una, tp->snd_nxt); > > + tcp_stats(sk, LINUX_MIB_TCPINVALIDACK); > > return -1; > > > > old_ack: > > @@ -3731,7 +3736,7 @@ static int tcp_ack(struct sock *sk, const struct > > sk_buff *skb, int flag) > > tcp_xmit_recovery(sk, rexmit); > > } > > > > - SOCK_DEBUG(sk, "Ack %u before %u:%u\n", ack, tp->snd_una, > > tp->snd_nxt); > > + tcp_stats(sk, LINUX_MIB_TCPOLDACK); > > return 0; > > } > > > > > These counters will add noise to an already crowded MIB space. > I have another idea that we can define some tcp bpf events to replace these MIB counters somehing like, #define BPF_EVENT_TCP_OLDACK 1 #define BPF_EVENT_TCP_PARTIALPACKET 2 ... Maybe we could also cleanup some MIBs to make it less crowded. > What bug do you expect to track and fix with these ? > Let me explain the background for you. I want to track some TCP abnormal behavior in TCP/IP stack. But I find there's no good way to do it. The current MIBs are per net, other than per socket, that makes it not very powerful. And the ancient SOCK_DEBUG is not good as well. So we think why not cleanup this ancient SOCK_DEBUG() and introduce a more powerful method. > I see many TCP patches coming adding icache pressure, enabling companies to > build their own modified > TCP stack, but no real meat. > Thanks Yafang