Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0abdaae authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "WLAN subsystem: Sysctl support for key TCP/IP parameters"

parents 9603d5d8 92528786
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -140,6 +140,9 @@ void tcp_time_wait(struct sock *sk, int state, int timeo);
						 * most likely due to retrans in 3WHS.
						 */

/* Number of full MSS to receive before Acking RFC2581 */
#define TCP_DELACK_SEG          1

#define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
					                 * for local resources.
					                 */
@@ -274,6 +277,11 @@ extern int sysctl_tcp_pacing_ca_ratio;
extern int sysctl_tcp_default_init_rwnd;

extern atomic_long_t tcp_memory_allocated;

/* sysctl variables for controlling various tcp parameters */
extern int sysctl_tcp_delack_seg;
extern int sysctl_tcp_use_userconfig;

extern struct percpu_counter tcp_sockets_allocated;
extern int tcp_memory_pressure;

@@ -364,6 +372,13 @@ ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

/* sysctl master controller */
extern int tcp_use_userconfig_sysctl_handler(struct ctl_table *table,
				int write, void __user *buffer, size_t *length,
				loff_t *ppos);
extern int tcp_proc_delayed_ack_control(struct ctl_table *table, int write,
				void __user *buffer, size_t *length,
				loff_t *ppos);
static inline void tcp_dec_quickack_mode(struct sock *sk,
					 const unsigned int pkts)
{
+23 −0
Original line number Diff line number Diff line
@@ -41,6 +41,10 @@ static int tcp_syn_retries_min = 1;
static int tcp_syn_retries_max = MAX_TCP_SYNCNT;
static int ip_ping_group_range_min[] = { 0, 0 };
static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX };
static int tcp_delack_seg_min = TCP_DELACK_MIN;
static int tcp_delack_seg_max = 60;
static int tcp_use_userconfig_min;
static int tcp_use_userconfig_max = 1;

/* Update system visible IP port range */
static void set_local_port_range(struct net *net, int range[2])
@@ -684,6 +688,25 @@ static struct ctl_table ipv4_table[] = {
		.proc_handler	= proc_dointvec_minmax,
		.extra1		= &one
	},
	{
		.procname	= "tcp_delack_seg",
		.data		= &sysctl_tcp_delack_seg,
		.maxlen		= sizeof(sysctl_tcp_delack_seg),
		.mode		= 0644,
		.proc_handler	= tcp_proc_delayed_ack_control,
		.extra1		= &tcp_delack_seg_min,
		.extra2		= &tcp_delack_seg_max,
	},
	{
		.procname       = "tcp_use_userconfig",
		.data           = &sysctl_tcp_use_userconfig,
		.maxlen         = sizeof(sysctl_tcp_use_userconfig),
		.mode           = 0644,
		.proc_handler   = tcp_use_userconfig_sysctl_handler,
		.extra1		= &tcp_use_userconfig_min,
		.extra2		= &tcp_use_userconfig_max,
	},

	{ }
};

+11 −2
Original line number Diff line number Diff line
@@ -300,6 +300,12 @@ EXPORT_SYMBOL(sysctl_tcp_wmem);
atomic_long_t tcp_memory_allocated;	/* Current allocated memory. */
EXPORT_SYMBOL(tcp_memory_allocated);

int sysctl_tcp_delack_seg __read_mostly = TCP_DELACK_SEG;
EXPORT_SYMBOL(sysctl_tcp_delack_seg);

int sysctl_tcp_use_userconfig __read_mostly;
EXPORT_SYMBOL(sysctl_tcp_use_userconfig);

/*
 * Current number of TCP sockets.
 */
@@ -1438,8 +1444,11 @@ static void tcp_cleanup_rbuf(struct sock *sk, int copied)
		   /* Delayed ACKs frequently hit locked sockets during bulk
		    * receive. */
		if (icsk->icsk_ack.blocked ||
		    /* Once-per-two-segments ACK was not sent by tcp_input.c */
		    tp->rcv_nxt - tp->rcv_wup > icsk->icsk_ack.rcv_mss ||
		/* Once-per-sysctl_tcp_delack_seg segments
		 * ACK was not sent by tcp_input.c
		 */
		    tp->rcv_nxt - tp->rcv_wup > (icsk->icsk_ack.rcv_mss) *
						sysctl_tcp_delack_seg ||
		    /*
		     * If this read emptied read buffer, we send ACK, if
		     * connection is not bidirectional, user drained
+2 −1
Original line number Diff line number Diff line
@@ -5104,7 +5104,8 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible)
	struct tcp_sock *tp = tcp_sk(sk);

	    /* More than one full frame received... */
	if (((tp->rcv_nxt - tp->rcv_wup) > inet_csk(sk)->icsk_ack.rcv_mss &&
	if (((tp->rcv_nxt - tp->rcv_wup) > (inet_csk(sk)->icsk_ack.rcv_mss) *
					sysctl_tcp_delack_seg &&
	     /* ... and right edge of window advances far enough.
	      * (tcp_recvmsg() will send ACK otherwise). Or...
	      */
+33 −1
Original line number Diff line number Diff line
@@ -24,13 +24,45 @@

int sysctl_tcp_thin_linear_timeouts __read_mostly;

static void set_tcp_default(void)
{
	sysctl_tcp_delack_seg = TCP_DELACK_SEG;
}

/*sysctl handler for tcp_ack realted master control */
int tcp_proc_delayed_ack_control(struct ctl_table *table, int write,
				 void __user *buffer, size_t *length,
				 loff_t *ppos)
{
	int ret = proc_dointvec_minmax(table, write, buffer, length, ppos);

	/* The ret value will be 0 if the input validation is successful
	 * and the values are written to sysctl table. If not, the stack
	 * will continue to work with currently configured values
	 */
	return ret;
}

/*sysctl handler for tcp_ack realted master control */
int tcp_use_userconfig_sysctl_handler(struct ctl_table *table, int write,
				      void __user *buffer, size_t *length,
				      loff_t *ppos)
{
	int ret = proc_dointvec_minmax(table, write, buffer, length, ppos);

	if (write && ret == 0) {
		if (!sysctl_tcp_use_userconfig)
			set_tcp_default();
	}
	return ret;
}

/**
 *  tcp_write_err() - close socket and save error info
 *  @sk:  The socket the error has appeared on.
 *
 *  Returns: Nothing (void)
 */

static void tcp_write_err(struct sock *sk)
{
	sk->sk_err = sk->sk_err_soft ? : ETIMEDOUT;