mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	mptcp: add CurrEstab MIB counter support
Add a new MIB counter named MPTCP_MIB_CURRESTAB to count current established MPTCP connections, similar to TCP_MIB_CURRESTAB. This is useful to quickly list the number of MPTCP connections without having to iterate over all of them. This patch adds a new helper function mptcp_set_state(): if the state switches from or to ESTABLISHED state, this newly added counter is incremented. This helper is going to be used in the following patch. Similar to MPTCP_INC_STATS(), a new helper called MPTCP_DEC_STATS() is also needed to decrement a MIB counter. Signed-off-by: Geliang Tang <geliang.tang@linux.dev> Acked-by: Paolo Abeni <pabeni@redhat.com> Reviewed-by: Matthieu Baerts <matttbe@kernel.org> Signed-off-by: Matthieu Baerts <matttbe@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									42a7889a19
								
							
						
					
					
						commit
						d9cd27b8cd
					
				
					 4 changed files with 28 additions and 0 deletions
				
			
		| 
						 | 
					@ -66,6 +66,7 @@ static const struct snmp_mib mptcp_snmp_list[] = {
 | 
				
			||||||
	SNMP_MIB_ITEM("RcvWndShared", MPTCP_MIB_RCVWNDSHARED),
 | 
						SNMP_MIB_ITEM("RcvWndShared", MPTCP_MIB_RCVWNDSHARED),
 | 
				
			||||||
	SNMP_MIB_ITEM("RcvWndConflictUpdate", MPTCP_MIB_RCVWNDCONFLICTUPDATE),
 | 
						SNMP_MIB_ITEM("RcvWndConflictUpdate", MPTCP_MIB_RCVWNDCONFLICTUPDATE),
 | 
				
			||||||
	SNMP_MIB_ITEM("RcvWndConflict", MPTCP_MIB_RCVWNDCONFLICT),
 | 
						SNMP_MIB_ITEM("RcvWndConflict", MPTCP_MIB_RCVWNDCONFLICT),
 | 
				
			||||||
 | 
						SNMP_MIB_ITEM("MPCurrEstab", MPTCP_MIB_CURRESTAB),
 | 
				
			||||||
	SNMP_MIB_SENTINEL
 | 
						SNMP_MIB_SENTINEL
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,6 +65,7 @@ enum linux_mptcp_mib_field {
 | 
				
			||||||
					 * conflict with another subflow while updating msk rcv wnd
 | 
										 * conflict with another subflow while updating msk rcv wnd
 | 
				
			||||||
					 */
 | 
										 */
 | 
				
			||||||
	MPTCP_MIB_RCVWNDCONFLICT,	/* Conflict with while updating msk rcv wnd */
 | 
						MPTCP_MIB_RCVWNDCONFLICT,	/* Conflict with while updating msk rcv wnd */
 | 
				
			||||||
 | 
						MPTCP_MIB_CURRESTAB,		/* Current established MPTCP connections */
 | 
				
			||||||
	__MPTCP_MIB_MAX
 | 
						__MPTCP_MIB_MAX
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,4 +96,11 @@ static inline void __MPTCP_INC_STATS(struct net *net,
 | 
				
			||||||
		__SNMP_INC_STATS(net->mib.mptcp_statistics, field);
 | 
							__SNMP_INC_STATS(net->mib.mptcp_statistics, field);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void MPTCP_DEC_STATS(struct net *net,
 | 
				
			||||||
 | 
									   enum linux_mptcp_mib_field field)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (likely(net->mib.mptcp_statistics))
 | 
				
			||||||
 | 
							SNMP_DEC_STATS(net->mib.mptcp_statistics, field);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool mptcp_mib_alloc(struct net *net);
 | 
					bool mptcp_mib_alloc(struct net *net);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2871,6 +2871,24 @@ void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how)
 | 
				
			||||||
	release_sock(ssk);
 | 
						release_sock(ssk);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mptcp_set_state(struct sock *sk, int state)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int oldstate = sk->sk_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (state) {
 | 
				
			||||||
 | 
						case TCP_ESTABLISHED:
 | 
				
			||||||
 | 
							if (oldstate != TCP_ESTABLISHED)
 | 
				
			||||||
 | 
								MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_CURRESTAB);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							if (oldstate == TCP_ESTABLISHED)
 | 
				
			||||||
 | 
								MPTCP_DEC_STATS(sock_net(sk), MPTCP_MIB_CURRESTAB);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inet_sk_state_store(sk, state);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const unsigned char new_state[16] = {
 | 
					static const unsigned char new_state[16] = {
 | 
				
			||||||
	/* current state:     new state:      action:	*/
 | 
						/* current state:     new state:      action:	*/
 | 
				
			||||||
	[0 /* (Invalid) */] = TCP_CLOSE,
 | 
						[0 /* (Invalid) */] = TCP_CLOSE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -641,6 +641,7 @@ bool __mptcp_close(struct sock *sk, long timeout);
 | 
				
			||||||
void mptcp_cancel_work(struct sock *sk);
 | 
					void mptcp_cancel_work(struct sock *sk);
 | 
				
			||||||
void __mptcp_unaccepted_force_close(struct sock *sk);
 | 
					void __mptcp_unaccepted_force_close(struct sock *sk);
 | 
				
			||||||
void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk);
 | 
					void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk);
 | 
				
			||||||
 | 
					void mptcp_set_state(struct sock *sk, int state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
 | 
					bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
 | 
				
			||||||
			   const struct mptcp_addr_info *b, bool use_port);
 | 
								   const struct mptcp_addr_info *b, bool use_port);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue