Netdev List
 help / color / mirror / Atom feed
* Re: pull request (net-next): ipsec-next 2014-09-25
From: David Miller @ 2014-09-28 21:19 UTC (permalink / raw)
  To: steffen.klassert; +Cc: herbert, netdev
In-Reply-To: <1411636225-4433-1-git-send-email-steffen.klassert@secunet.com>

From: Steffen Klassert <steffen.klassert@secunet.com>
Date: Thu, 25 Sep 2014 11:10:21 +0200

> 1) Remove useless hash_resize_mutex in xfrm_hash_resize().
>    This mutex is used only there, but xfrm_hash_resize()
>    can't be called concurrently at all. From Ying Xue.
> 
> 2) Extend policy hashing to prefixed policies based on
>    prefix lenght thresholds. From Christophe Gouault.
> 
> 3) Make the policy hash table thresholds configurable
>    via netlink. From Christophe Gouault.
> 
> 4) Remove the maximum authentication length for AH.
>    This was needed to limit stack usage. We switched
>    already to allocate space, so no need to keep the
>    limit. From Herbert Xu.

Pulled, thanks a lot Steffen.

^ permalink raw reply

* Re: [PATCH 0/3] defxx: DEFEA fixes and updates
From: David Miller @ 2014-09-28 21:22 UTC (permalink / raw)
  To: macro; +Cc: netdev
In-Reply-To: <alpine.LFD.2.11.1409242337420.6148@eddie.linux-mips.org>

From: "Maciej W. Rozycki" <macro@linux-mips.org>
Date: Thu, 25 Sep 2014 11:06:33 +0100 (BST)

>  I have finally got my hands on an EISA variation of the board (DEC 
> FDDIcontroller/EISA aka DEFEA) and was able to do some testing.  Here are 
> initial updates to the driver that address problems I encountered so far.  
> More to come later on as I get back to the system that I have in a remote 
> location -- I need to double-check MMIO support and see what might have 
> been causing spurious interrupts I saw with the 8259A PIC the board's 
> interrupt line has been routed to.

Series applied to net-next, thank you.

^ permalink raw reply

* Re: [PATCH net-next 0/3] r8152: support setting eee by ethtool
From: David Miller @ 2014-09-28 21:24 UTC (permalink / raw)
  To: hayeswang; +Cc: netdev, nic_swsd, linux-kernel, linux-usb
In-Reply-To: <1394712342-15778-46-Taiwan-albertk@realtek.com>

From: Hayes Wang <hayeswang@realtek.com>
Date: Thu, 25 Sep 2014 20:53:59 +0800

> Modify some definitions about EEE, and add the support of setting
> the EEE through ethtool.

Series applied, thanks.

^ permalink raw reply

* Re: [PATCH net-next] mlx4: exploit skb->xmit_more to conditionally send doorbell
From: David Miller @ 2014-09-28 21:27 UTC (permalink / raw)
  To: eric.dumazet; +Cc: netdev, amirv
In-Reply-To: <1411654669.16953.17.camel@edumazet-glaptop2.roam.corp.google.com>

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Thu, 25 Sep 2014 07:17:49 -0700

> From: Eric Dumazet <edumazet@google.com>
> 
> skb->xmit_more tells us if another skb is coming next.
> 
> We need to send doorbell when : xmit_more is not set,
> or txqueue is stopped (preventing next skb to come immediately)
> 
> Tested with a modified pktgen version, I got a 40% increase of
> throughput.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Applied, thanks Eric.

^ permalink raw reply

* Re: [Patch net-next] net_sched: remove the first parameter from tcf_exts_destroy()
From: David Miller @ 2014-09-28 21:29 UTC (permalink / raw)
  To: xiyou.wangcong; +Cc: netdev, jhs
In-Reply-To: <1411665997-11013-1-git-send-email-xiyou.wangcong@gmail.com>

From: Cong Wang <xiyou.wangcong@gmail.com>
Date: Thu, 25 Sep 2014 10:26:37 -0700

> Cc: Jamal Hadi Salim <jhs@mojatatu.com>
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>

Applied.

^ permalink raw reply

* Re: [RFC PATCH net-next] arp: Do not perturb drop profiles with ignored ARP packets
From: David Miller @ 2014-09-28 21:31 UTC (permalink / raw)
  To: raj; +Cc: netdev
In-Reply-To: <20140925175528.8DFF329004BA@tardy>

From: raj@tardy.usa.hp.com (Rick Jones)
Date: Thu, 25 Sep 2014 10:55:28 -0700 (PDT)

> 
> From: Rick Jones <rick.jones2@hp.com>
> 
> We do not wish to disturb dropwatch or perf drop profiles with an ARP
> we will ignore.
> 
> Signed-off-by: Rick Jones <rick.jones2@hp.com>

This is fine, applied, thanks Rick.

^ permalink raw reply

* Re: [PATCH net-next 0/4] Use new BAR2 GTS for T5, adds adaptive rx and few Device ID's
From: David Miller @ 2014-09-28 21:34 UTC (permalink / raw)
  To: hariprasad; +Cc: netdev, leedom, kumaras, nirranjan, santosh
In-Reply-To: <1411671235-6527-1-git-send-email-hariprasad@chelsio.com>

From: Hariprasad Shenai <hariprasad@chelsio.com>
Date: Fri, 26 Sep 2014 00:23:51 +0530

> This patch series adds support to use new BAR2 GTS for T5 adapter.
> Adds support for adaptive rx. Remove redundant variable from a macro of
> cxgb4vf driver. Adds Device ID for new adapters.
> 
> The patches series is created against 'net-next' tree.
> And includes patches on cxgb4 and cxgb4vf driver.
> 
> We have included all the maintainers of respective drivers. Kindly review the
> change and let us know in case of any review comments.

Series applied, thanks.

^ permalink raw reply

* Re: [Patch net-next 1/2] net_sched: fix errno in tcindex_set_parms()
From: David Miller @ 2014-09-28 21:35 UTC (permalink / raw)
  To: xiyou.wangcong; +Cc: netdev, john.fastabend
In-Reply-To: <1411671965-18887-1-git-send-email-xiyou.wangcong@gmail.com>

From: Cong Wang <xiyou.wangcong@gmail.com>
Date: Thu, 25 Sep 2014 12:06:04 -0700

> When kmemdup() fails, we should return -ENOMEM.
> 
> Cc: John Fastabend <john.fastabend@gmail.com>
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>

Applied.

^ permalink raw reply

* Re: [Patch net-next 2/2] net_sched: fix another regression in cls_tcindex
From: David Miller @ 2014-09-28 21:35 UTC (permalink / raw)
  To: xiyou.wangcong; +Cc: netdev, john.fastabend
In-Reply-To: <1411671965-18887-2-git-send-email-xiyou.wangcong@gmail.com>

From: Cong Wang <xiyou.wangcong@gmail.com>
Date: Thu, 25 Sep 2014 12:06:05 -0700

> Clearly the following change is not expected:
> 
> 	-       if (!cp.perfect && !cp.h)
> 	-               cp.alloc_hash = cp.hash;
> 	+       if (!cp->perfect && cp->h)
> 	+               cp->alloc_hash = cp->hash;
> 
> Fixes: commit 331b72922c5f58d48fd ("net: sched: RCU cls_tcindex")
> Cc: John Fastabend <john.fastabend@gmail.com>
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>

Applied.

^ permalink raw reply

* Re: [PATCH net-next] net: reorganize sk_buff for faster __copy_skb_header()
From: David Miller @ 2014-09-28 21:37 UTC (permalink / raw)
  To: eric.dumazet; +Cc: netdev, amirv, john.r.fastabend, brouer
In-Reply-To: <1411680004.16953.57.camel@edumazet-glaptop2.roam.corp.google.com>

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Thu, 25 Sep 2014 14:20:04 -0700

> From: Eric Dumazet <edumazet@google.com>
> 
> With proliferation of bit fields in sk_buff, __copy_skb_header() became
> quite expensive, showing as the most expensive function in a GSO
> workload.
> 
> __copy_skb_header() performance is also critical for non GSO TCP
> operations, as it is used from skb_clone()
> 
> This patch carefully moves all the fields that were not copied in a
> separate zone : cloned, nohdr, fclone, peeked, head_frag, xmit_more
> 
> Then I moved all other fields and all other copied fields in a section
> delimited by headers_start[0]/headers_end[0] section so that we
> can use a single memcpy() call, inlined by compiler using long
> word load/stores.
> 
> I also tried to make all copies in the natural orders of sk_buff,
> to help hardware prefetching.
> 
> I made sure sk_buff size did not change.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Applied, thanks!

^ permalink raw reply

* Re: [PATCH net-next] dql: dql_queued() should write first to reduce bus transactions
From: David Miller @ 2014-09-28 21:43 UTC (permalink / raw)
  To: eric.dumazet
  Cc: therbert, brouer, netdev, alexander.h.duyck, toke, fw, jhs,
	dave.taht, john.r.fastabend, dborkman, hannes
In-Reply-To: <1411711496.16953.92.camel@edumazet-glaptop2.roam.corp.google.com>

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Thu, 25 Sep 2014 23:04:56 -0700

> From: Eric Dumazet <edumazet@google.com>
> 
> While doing high throughput test on a BQL enabled NIC,
> I found a very high cost in ndo_start_xmit() when accessing BQL data.
> 
> It turned out the problem was caused by compiler trying to be
> smart, but involving a bad MESI transaction :
> 
>   0.05 │  mov    0xc0(%rax),%edi    // LOAD dql->num_queued
>   0.48 │  mov    %edx,0xc8(%rax)    // STORE dql->last_obj_cnt = count
>  58.23 │  add    %edx,%edi
>   0.58 │  cmp    %edi,0xc4(%rax)
>   0.76 │  mov    %edi,0xc0(%rax)    // STORE dql->num_queued += count
>   0.72 │  js     bd8
> 
> 
> I got an incredible 10 % gain [1] by making sure cpu do not attempt
> to get the cache line in Shared mode, but directly requests for
> ownership.
> 
> New code :
> 	mov    %edx,0xc8(%rax)  // STORE dql->last_obj_cnt = count
> 	add    %edx,0xc0(%rax)  // RMW   dql->num_queued += count
> 	mov    0xc4(%rax),%ecx  // LOAD dql->adj_limit
> 	mov    0xc0(%rax),%edx  // LOAD dql->num_queued
> 	cmp    %edx,%ecx
> 
> The TX completion was running from another cpu, with high interrupts
> rate.
> 
> Note that I am using barrier() as a soft hint, as mb() here could be
> too heavy cost.
> 
> [1] This was a netperf TCP_STREAM with TSO disabled, but GSO enabled.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Ok now you're just showing off :-)  Applied, thanks!

^ permalink raw reply

* Re: [PATCH 9/11 V2 NEXT] rtlwifi: rtl8188ee: Update driver to match Realtek release of 06282014
From: Larry Finger @ 2014-09-28 22:40 UTC (permalink / raw)
  To: Francois Romieu; +Cc: linville, linux-wireless, troy_tan, netdev
In-Reply-To: <20140927194939.GA28553@electric-eye.fr.zoreil.com>

On 09/27/2014 02:49 PM, Francois Romieu wrote:
>
> Larry Finger <Larry.Finger@lwfinger.net> :
> [...]
>> diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
>> index 40738e3..d30f416 100644
>> --- a/drivers/net/wireless/rtlwifi/core.c
>> +++ b/drivers/net/wireless/rtlwifi/core.c
>> @@ -28,6 +28,7 @@
>>   #include "cam.h"
>>   #include "base.h"
>>   #include "ps.h"
>> +#include "pwrseqcmd.h"
>>
>>   #include "btcoexist/rtl_btc.h"
>>   #include <linux/firmware.h>
>> @@ -1700,3 +1701,100 @@ const struct ieee80211_ops rtl_ops = {
>>   };
>>   EXPORT_SYMBOL_GPL(rtl_ops);
>>
>> +/*	Description:
>> + *		This routine deals with the Power Configuration CMD
>> + *		 parsing for RTL8723/RTL8188E Series IC.
>> + *	Assumption:
>> + *		We should follow specific format that was released from HW SD.
>
> "released" is a bit misleading if it does not mean "publicly released".
>
>> + */
>> +bool rtl_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
>> +			      u8 faversion, u8 interface_type,
>> +			      struct wlan_pwr_cfg pwrcfgcmd[])
>> +{
>> +	struct wlan_pwr_cfg cfg_cmd = {0};
>> +	bool polling_bit = false;
>> +	u32 ary_idx = 0;
>
> 	u32 i;
>
>> +	u8 value = 0;
>> +	u32 offset = 0;
>
> Useless init.
>
>> +	u32 polling_count = 0;
>
> Wrong scope.
>
>> +	u32 max_polling_cnt = 5000;
>
> Inverted xmas tree for declaration.

I do not understand what you mean here.

>
>> +
>> +	do {
>
> 	while (1) {
>
>> +		cfg_cmd = pwrcfgcmd[ary_idx];
>> +		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
>> +			 "rtl_hal_pwrseqcmdparsing(): offset(%#x),cut_msk(%#x), famsk(%#x), interface_msk(%#x), base(%#x), cmd(%#x), msk(%#x), value(%#x)\n",
>                                                                  ^^^ missing space
>
>> +			 GET_PWR_CFG_OFFSET(cfg_cmd),
>> +					    GET_PWR_CFG_CUT_MASK(cfg_cmd),
>> +			 GET_PWR_CFG_FAB_MASK(cfg_cmd),
>> +					      GET_PWR_CFG_INTF_MASK(cfg_cmd),
>> +			 GET_PWR_CFG_BASE(cfg_cmd), GET_PWR_CFG_CMD(cfg_cmd),
>> +			 GET_PWR_CFG_MASK(cfg_cmd), GET_PWR_CFG_VALUE(cfg_cmd));
>> +
>> +		if ((GET_PWR_CFG_FAB_MASK(cfg_cmd)&faversion) &&
>> +		    (GET_PWR_CFG_CUT_MASK(cfg_cmd)&cut_version) &&
>                                                   ^^^ missing spaces
>
>> +		    (GET_PWR_CFG_INTF_MASK(cfg_cmd)&interface_type)) {
>> +			switch (GET_PWR_CFG_CMD(cfg_cmd)) {
>> +			case PWR_CMD_READ:
>> +				RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
>> +					"rtl_hal_pwrseqcmdparsing(): PWR_CMD_READ\n");
>
> It should line up after the parenthesis.
>
>> +				break;
>> +			case PWR_CMD_WRITE:
>> +				RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
>> +					"rtl_hal_pwrseqcmdparsing(): PWR_CMD_WRITE\n");
>> +				offset = GET_PWR_CFG_OFFSET(cfg_cmd);
>> +
>> +				/*Read the value from system register*/
>> +				value = rtl_read_byte(rtlpriv, offset);
>> +				value &= (~(GET_PWR_CFG_MASK(cfg_cmd)));
>
> Excess parenthsis.
>
>> +				value |= (GET_PWR_CFG_VALUE(cfg_cmd) &
>> +					  GET_PWR_CFG_MASK(cfg_cmd));
>
> Excess parenthsis.
>
>> +
>> +				/*Write the value back to sytem register*/
>> +				rtl_write_byte(rtlpriv, offset, value);
>> +				break;
>> +			case PWR_CMD_POLLING:
>> +				RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
>> +					"rtl_hal_pwrseqcmdparsing(): PWR_CMD_POLLING\n");
>
> It should line up after the parenthesis.
>
>> +				polling_bit = false;
>> +				offset = GET_PWR_CFG_OFFSET(cfg_cmd);
>> +
>> +				do {
>> +					value = rtl_read_byte(rtlpriv, offset);
>> +
>> +					value &= GET_PWR_CFG_MASK(cfg_cmd);
>> +					if (value ==
>> +					    (GET_PWR_CFG_VALUE(cfg_cmd) &
>> +					     GET_PWR_CFG_MASK(cfg_cmd)))
>> +						polling_bit = true;
>> +					else
>> +						udelay(10);
>> +
>> +					if (polling_count++ > max_polling_cnt)
>> +						return false;
>> +				} while (!polling_bit);
>
> Simple "for" loop in disguise.
>
> An helper function may help.
>
> Imnsho the whole do { more, more, more } while (1) concept is broken.
>
> [...]
>> diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/def.h b/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
>> index c764fff..d9ea9d0 100644
>> --- a/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
>> +++ b/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
> [...]
>> @@ -225,44 +218,37 @@ enum power_polocy_config {
>>   };
>>
>>   enum interface_select_pci {
>> -	INTF_SEL1_MINICARD,
>> -	INTF_SEL0_PCIE,
>> -	INTF_SEL2_RSV,
>> -	INTF_SEL3_RSV,
>> +	INTF_SEL1_MINICARD = 0,
>> +	INTF_SEL0_PCIE = 1,
>> +	INTF_SEL2_RSV = 2,
>> +	INTF_SEL3_RSV = 3,
>
> Please use tabs to line things up.
>
> [...]
>> +	HAL_FW_C2H_CMD_READ_MACREG = 0,
>> +	HAL_FW_C2H_CMD_READ_BBREG = 1,
>> +	HAL_FW_C2H_CMD_READ_RFREG = 2,
>> +	HAL_FW_C2H_CMD_READ_EEPROM = 3,
>> +	HAL_FW_C2H_CMD_READ_EFUSE = 4,
>
> See above.
>
> [...]
>> diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
>> index f8daa61..2aa34d9 100644
>> --- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
>> +++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
> [...]
>> -			rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, MASKDWORD,
>> -				      value32);
>> +			rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
>> +				      MASKDWORD, value32);
>
> It lacks of consistency, see the *NICE* marker below.
>
>>   			value32 = (ele_c & 0x000003C0) >> 6;
>> -			rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS, value32);
>> +			rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
>> +				      value32);
>
> ?
>
>>   			value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
>> -			rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(24), value32);
>> +			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
>> +				      value32);
>>   			break;
>>   		case RF90_PATH_B:
>>   			value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
>> -			rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBAL,
>> -				      MASKDWORD, value32);
>> +			rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
>> +				      value32);
>
> *NICE*
>
> [...]
>> @@ -210,16 +209,20 @@ static void rtl88e_set_iqk_matrix(struct ieee80211_hw *hw,
>>   	} else {
>>   		switch (rfpath) {
>>   		case RF90_PATH_A:
>> -			rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, MASKDWORD,
>> -				      ofdmswing_table[ofdm_index]);
>> -			rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS, 0x00);
>> -			rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(24), 0x00);
>> +			rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
>> +				      MASKDWORD, ofdmswing_table[ofdm_index]);
>> +			rtl_set_bbreg(hw, ROFDM0_XCTXAFE,
>> +				      MASKH4BITS, 0x00);
>
> 			rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS, 0x00);
>
>> +			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
>> +				      BIT(24), 0x00);
>
> 			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24), 0x00);
>
>>   			break;
>>   		case RF90_PATH_B:
>> -			rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBAL, MASKDWORD,
>> -				      ofdmswing_table[ofdm_index]);
>> -			rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, 0x00);
>> -			rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(28), 0x00);
>> +			rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
>> +				      MASKDWORD, ofdmswing_table[ofdm_index]);
>> +			rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
>> +				      MASKH4BITS, 0x00);
>
> 			rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, 0x00);
>
>> +			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
>> +				      BIT(28), 0x00);
>
> 			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28), 0x00);
>
> [...]
>> @@ -263,46 +266,75 @@ void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
>>   			 (pwr_val << 24);
>>   }
>>
>> -
>> -static void rtl88e_chk_tx_track(struct ieee80211_hw *hw,
>> -				enum pwr_track_control_method method,
>> -				u8 rfpath, u8 index)
>> +static void dm_tx_pwr_track_set_pwr(struct ieee80211_hw *hw,
>> +				    enum pwr_track_control_method method,
>> +				    u8 rfpath, u8 channel_mapped_index)
>>   {
>>   	struct rtl_priv *rtlpriv = rtl_priv(hw);
>> -	struct rtl_phy *rtlphy = &(rtlpriv->phy);
>> +	struct rtl_phy *rtlphy = &rtlpriv->phy;
>>   	struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
>> -	int jj = rtldm->swing_idx_cck;
>> -	int i;
>>
>>   	if (method == TXAGC) {
>> -		if (rtldm->swing_flag_ofdm == true ||
>> -		    rtldm->swing_flag_cck == true) {
>> -			u8 chan = rtlphy->current_channel;
>> -			rtl88e_phy_set_txpower_level(hw, chan);
>> +		if (rtldm->swing_flag_ofdm ||
>> +		    rtldm->swing_flag_cck) {
>
> Single line.
>
>> +			rtl88e_phy_set_txpower_level(hw,
>> +						     rtlphy->current_channel);
>>   			rtldm->swing_flag_ofdm = false;
>>   			rtldm->swing_flag_cck = false;
>>   		}
>>   	} else if (method == BBSWING) {
>>   		if (!rtldm->cck_inch14) {
>> -			for (i = 0; i < 8; i++)
>> -				rtl_write_byte(rtlpriv, 0xa22 + i,
>> -					       cck_tbl_ch1_13[jj][i]);
>> +			rtl_write_byte(rtlpriv, 0xa22,
>> +				       cck_tbl_ch1_13[rtldm->swing_idx_cck][0]);
>> +			rtl_write_byte(rtlpriv, 0xa23,
>> +				       cck_tbl_ch1_13[rtldm->swing_idx_cck][1]);
>> +			rtl_write_byte(rtlpriv, 0xa24,
>> +				       cck_tbl_ch1_13[rtldm->swing_idx_cck][2]);
>> +			rtl_write_byte(rtlpriv, 0xa25,
>> +				       cck_tbl_ch1_13[rtldm->swing_idx_cck][3]);
>> +			rtl_write_byte(rtlpriv, 0xa26,
>> +				       cck_tbl_ch1_13[rtldm->swing_idx_cck][4]);
>> +			rtl_write_byte(rtlpriv, 0xa27,
>> +				       cck_tbl_ch1_13[rtldm->swing_idx_cck][5]);
>> +			rtl_write_byte(rtlpriv, 0xa28,
>> +				       cck_tbl_ch1_13[rtldm->swing_idx_cck][6]);
>> +			rtl_write_byte(rtlpriv, 0xa29,
>> +				       cck_tbl_ch1_13[rtldm->swing_idx_cck][7]);
>
> ?
>
> I hope someone got the "-R" flag of patch wrong.
>
>>   		} else {
>> -			for (i = 0; i < 8; i++)
>> -				rtl_write_byte(rtlpriv, 0xa22 + i,
>> -					       cck_tbl_ch14[jj][i]);
>> +			rtl_write_byte(rtlpriv, 0xa22,
>> +				       cck_tbl_ch14[rtldm->swing_idx_cck][0]);
>> +			rtl_write_byte(rtlpriv, 0xa23,
>> +				       cck_tbl_ch14[rtldm->swing_idx_cck][1]);
>> +			rtl_write_byte(rtlpriv, 0xa24,
>> +				       cck_tbl_ch14[rtldm->swing_idx_cck][2]);
>> +			rtl_write_byte(rtlpriv, 0xa25,
>> +				       cck_tbl_ch14[rtldm->swing_idx_cck][3]);
>> +			rtl_write_byte(rtlpriv, 0xa26,
>> +				       cck_tbl_ch14[rtldm->swing_idx_cck][4]);
>> +			rtl_write_byte(rtlpriv, 0xa27,
>> +				       cck_tbl_ch14[rtldm->swing_idx_cck][5]);
>> +			rtl_write_byte(rtlpriv, 0xa28,
>> +				       cck_tbl_ch14[rtldm->swing_idx_cck][6]);
>> +			rtl_write_byte(rtlpriv, 0xa29,
>> +				       cck_tbl_ch14[rtldm->swing_idx_cck][7]);
>
> Sic.
>
>>   		}
>>
>>   		if (rfpath == RF90_PATH_A) {
>> -			long x = rtlphy->iqk_matrix[index].value[0][0];
>> -			long y = rtlphy->iqk_matrix[index].value[0][1];
>> -			u8 indx = rtldm->swing_idx_ofdm[rfpath];
>> -			rtl88e_set_iqk_matrix(hw, indx, rfpath, x, y);
>> +			rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
>> +					      rfpath, rtlphy->iqk_matrix
>> +					      [channel_mapped_index].
>> +					      value[0][0],
>> +					      rtlphy->iqk_matrix
>> +					      [channel_mapped_index].
>> +					      value[0][1]);
>>   		} else if (rfpath == RF90_PATH_B) {
>> -			u8 indx = rtldm->swing_idx_ofdm[rfpath];
>> -			long x = rtlphy->iqk_matrix[indx].value[0][4];
>> -			long y = rtlphy->iqk_matrix[indx].value[0][5];
>> -			rtl88e_set_iqk_matrix(hw, indx, rfpath, x, y);
>> +			rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
>> +					      rfpath, rtlphy->iqk_matrix
>> +					      [channel_mapped_index].
>> +					      value[0][4],
>> +					      rtlphy->iqk_matrix
>> +					      [channel_mapped_index].
>> +					      value[0][5]);
>
> :o(
>
> I stop here. I don't enjoy playing the bad cop and this patch is feeding crap
> into the kernel.

Thanks for the review.

As I explained in V1 of these patches, I am trying to merge the kernel and 
Realtek internal code repositories in the hope that Realtek will keep the two of 
them in sync. In addition, I am hoping that they will take over maintaining 
these codes in the future.

If I insist on an absolute minimum of change in the kernel code, then the churn 
of the Realtek repo is increased, and I run the risk of failing in the process 
of merging the two repos. In my estimation, that would be a bigger disaster than 
getting some code into the kernel that is not as pretty as could be. In 
addition, I am not sure how much longer I want to volunteer full time to support 
these codes.

Larry

^ permalink raw reply

* Re: [patch iproute2] bond_slave: add help and fail on unknown opt
From: Stephen Hemminger @ 2014-09-28 22:56 UTC (permalink / raw)
  To: Jiri Pirko; +Cc: netdev, davem, nikolay
In-Reply-To: <1409903125-21200-1-git-send-email-jiri@resnulli.us>

On Fri,  5 Sep 2014 09:45:25 +0200
Jiri Pirko <jiri@resnulli.us> wrote:

> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
> ---
>  ip/iplink_bond_slave.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/ip/iplink_bond_slave.c b/ip/iplink_bond_slave.c
> index aacba14..3c26f08 100644
> --- a/ip/iplink_bond_slave.c
> +++ b/ip/iplink_bond_slave.c
> @@ -17,6 +17,13 @@
>  #include "utils.h"
>  #include "ip_common.h"
>  
> +static void explain(void)
> +{
> +	fprintf(stderr,
> +		"Usage: ... bond_slave [ queue_id QUEUE_ID ]\n"
> +	);
> +}
> +
>  static const char *slave_states[] = {
>  	[BOND_STATE_ACTIVE] = "ACTIVE",
>  	[BOND_STATE_BACKUP] = "BACKUP",
> @@ -91,6 +98,14 @@ static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv,
>  			if (get_u16(&queue_id, *argv, 0))
>  				invarg("queue_id is invalid", *argv);
>  			addattr16(n, 1024, IFLA_BOND_SLAVE_QUEUE_ID, queue_id);
> +		} else if (matches(*argv, "help") == 0) {
> +			explain();
> +			return -1;
> +		} else {
> +			fprintf(stderr, "bond_slave: unknown option \"%s\"?\n",
> +				*argv);
> +			explain();
> +			return -1;
>  		}
>  		argc--, argv++;
>  	}

This patch does not apply. there is probably some earlier patch you forgot to send about
BOND_SLAVE_QUEUE_ID.

^ permalink raw reply

* Re: [PATCH iproute2] ip: support of usec rtt in tcp_metrics
From: Stephen Hemminger @ 2014-09-28 22:59 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: netdev
In-Reply-To: <1409961244.26422.142.camel@edumazet-glaptop2.roam.corp.google.com>

On Fri, 05 Sep 2014 16:54:04 -0700
Eric Dumazet <eric.dumazet@gmail.com> wrote:

> From: Eric Dumazet <edumazet@google.com>
> 
> Starting from linux-3.15, kernel supports new tcp metric attributes :
> TCP_METRIC_RTT_US & TCP_METRIC_RTTVAR_US
> 
> Update ip command to detect their use.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Applied thanks

^ permalink raw reply

* Re: [PATCH] ip monitor: Skip IPv6 ND user option messages
From: Stephen Hemminger @ 2014-09-28 23:00 UTC (permalink / raw)
  To: Vadim Kochan; +Cc: netdev
In-Reply-To: <1409862262-4419-1-git-send-email-vadim4j@gmail.com>

On Thu,  4 Sep 2014 23:24:22 +0300
Vadim Kochan <vadim4j@gmail.com> wrote:

> IPv6 router sends ND messages with RDNSS option
> which causes the printing of unknown message by 'ip monitor':
> 
>     Unknown message: 0000004c 00000044 00000000
> 
> Signed-off-by: Vadim Kochan <vadim4j@gmail.com>

Applied.

^ permalink raw reply

* Re: [PATCH v2] ip monitor: Dont print timestamp or banner-label for cloned routes
From: Stephen Hemminger @ 2014-09-28 23:02 UTC (permalink / raw)
  To: Vadim Kochan; +Cc: netdev
In-Reply-To: <1409860088-3067-1-git-send-email-vadim4j@gmail.com>

On Thu,  4 Sep 2014 22:48:08 +0300
Vadim Kochan <vadim4j@gmail.com> wrote:

> This is ugly fix but solves the case when timestamp
> or banner-label is printed before the cloned route will be skipped
> by iproute filter which filters out all cached routes by default.
> In such case timestamp will be printed twice:
> 
>     Timestamp: Thu Sep  4 19:46:59 2014 457933 usec
>     Timestamp: Thu Sep  4 19:47:07 2014 977970 usec
>     10.3.5.1 dev wlp3s0 lladdr XX:XX:XX:XX:XX:XX STALE
> 
> Signed-off-by: Vadim Kochan <vadim4j@gmail.com>

Applied

^ permalink raw reply

* Re: [Patch iproute2] iplink: forbid negative ifindex and modifying ifindex
From: Stephen Hemminger @ 2014-09-28 23:04 UTC (permalink / raw)
  To: Cong Wang; +Cc: netdev
In-Reply-To: <1409960174-11208-1-git-send-email-xiyou.wangcong@gmail.com>

On Fri,  5 Sep 2014 16:36:14 -0700
Cong Wang <xiyou.wangcong@gmail.com> wrote:

> Cc: Stephen Hemminger <stephen@networkplumber.org>
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>

Applied

^ permalink raw reply

* Re: [patch iproute2] add help command to bonding master
From: Stephen Hemminger @ 2014-09-28 23:07 UTC (permalink / raw)
  To: Jiri Pirko; +Cc: netdev, davem, nikolay
In-Reply-To: <1409923456-14596-1-git-send-email-jiri@resnulli.us>

On Fri,  5 Sep 2014 15:24:16 +0200
Jiri Pirko <jiri@resnulli.us> wrote:

> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
> ---
>  ip/iplink_bond.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/ip/iplink_bond.c b/ip/iplink_bond.c
> index b5c511e..0a1ed03 100644
> --- a/ip/iplink_bond.c
> +++ b/ip/iplink_bond.c
> @@ -339,6 +339,9 @@ static int bond_parse_opt(struct link_util *lu, int argc, char **argv,
>  			}
>  			ad_select = get_index(ad_select_tbl, *argv);
>  			addattr8(n, 1024, IFLA_BOND_AD_SELECT, ad_select);
> +		} else if (matches(*argv, "help") == 0) {
> +			explain();
> +			return -1;
>  		} else {
>  			fprintf(stderr, "bond: unknown command \"%s\"?\n", *argv);
>  			explain();

Applied

^ permalink raw reply

* Re: [patch iproute2 1/2] add bridge_slave device support
From: Stephen Hemminger @ 2014-09-28 23:09 UTC (permalink / raw)
  To: Jiri Pirko; +Cc: netdev, davem, sfeldma, arvid.brodin, sucheta.chakraborty
In-Reply-To: <1409925309-17881-1-git-send-email-jiri@resnulli.us>

On Fri,  5 Sep 2014 15:55:08 +0200
Jiri Pirko <jiri@resnulli.us> wrote:

> Note this depends on "iproute2: allow to change slave options via
> type_slave"
> 
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>
> ---
>  ip/Makefile              |   3 +-
>  ip/iplink_bridge_slave.c | 181 +++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 183 insertions(+), 1 deletion(-)
>  create mode 100644 ip/iplink_bridge_slave.c

Both applied

^ permalink raw reply

* Re: [PATCH iproute2] ip monitor: Changed 'Unknown message' format to be more informative
From: Stephen Hemminger @ 2014-09-28 23:15 UTC (permalink / raw)
  To: Vadim Kochan; +Cc: netdev
In-Reply-To: <1410891830-4556-1-git-send-email-vadim4j@gmail.com>

On Tue, 16 Sep 2014 21:23:50 +0300
Vadim Kochan <vadim4j@gmail.com> wrote:

> In case if unknown message was handled then it will be displayed as:
> 
>     Unknown message: type=0x00000044(68) flags=0x00000000(0) len=0x0000004c(76)
> 
> Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
> ---
>  ip/ipmonitor.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/ip/ipmonitor.c b/ip/ipmonitor.c
> index 70f2a7a..838934d 100644
> --- a/ip/ipmonitor.c
> +++ b/ip/ipmonitor.c
> @@ -135,8 +135,10 @@ static int accept_msg(const struct sockaddr_nl *who,
>  		return 0;
>  	if (n->nlmsg_type != NLMSG_ERROR && n->nlmsg_type != NLMSG_NOOP &&
>  	    n->nlmsg_type != NLMSG_DONE) {
> -		fprintf(fp, "Unknown message: %08x %08x %08x\n",
> -			n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags);
> +		fprintf(fp, "Unknown message: type=0x%08x(%d) flags=0x%08x(%d)"
> +			"len=0x%08x(%d)\n", n->nlmsg_type, n->nlmsg_type,
> +		       	n->nlmsg_flags, n->nlmsg_flags, n->nlmsg_len,
> +		       	n->nlmsg_len);
>  	}
>  	return 0;
>  }

Patch is formatted improperly, it should be indented only with tabs.

^ permalink raw reply

* Re: [PATCH iproute2] ip tuntap: Added missing commands in usage
From: Stephen Hemminger @ 2014-09-28 23:20 UTC (permalink / raw)
  To: Vadim Kochan; +Cc: netdev
In-Reply-To: <1410902651-9240-1-git-send-email-vadim4j@gmail.com>

On Wed, 17 Sep 2014 00:24:11 +0300
Vadim Kochan <vadim4j@gmail.com> wrote:

> show, list, lst and help commands were not printed in usage.
> 
> Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
> ---
>  ip/iptuntap.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/ip/iptuntap.c b/ip/iptuntap.c
> index 2391af2..0ce64a6 100644
> --- a/ip/iptuntap.c
> +++ b/ip/iptuntap.c
> @@ -36,7 +36,7 @@ static void usage(void) __attribute__((noreturn));
>  
>  static void usage(void)
>  {
> -	fprintf(stderr, "Usage: ip tuntap { add | del } [ dev PHYS_DEV ] \n");
> +	fprintf(stderr, "Usage: ip tuntap { add | del | show | list | lst | help } [ dev PHYS_DEV ] \n");
>  	fprintf(stderr, "          [ mode { tun | tap } ] [ user USER ] [ group GROUP ]\n");
>  	fprintf(stderr, "          [ one_queue ] [ pi ] [ vnet_hdr ] [ multi_queue ]\n");
>  	fprintf(stderr, "\n");

both tuntap patches applied

^ permalink raw reply

* Re: [PATCH iproute2 2/2] ip/vxlan: fix display of maxaddress option
From: Stephen Hemminger @ 2014-09-28 23:21 UTC (permalink / raw)
  To: Nicolas Dichtel; +Cc: shemminger, netdev
In-Reply-To: <1410274511-17709-2-git-send-email-nicolas.dichtel@6wind.com>

On Tue,  9 Sep 2014 16:55:11 +0200
Nicolas Dichtel <nicolas.dichtel@6wind.com> wrote:

> Parenthesis are required else maxaddr value is a bool and thus output is always
> 1 when the option is set.
> 
> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
> ---
>  ip/iplink_vxlan.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 

Both patches applied

^ permalink raw reply

* [PATCH] tun: make sure interface usage can not overflow
From: Kees Cook @ 2014-09-28 23:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: David S. Miller, Jason Wang, Zhi Yong Wu, Michael S. Tsirkin,
	Tom Herbert, Masatake YAMATO, Xi Wang, stephen hemminger, netdev

This makes the size argument a const, since it is always populated by
the caller. Additionally double-checks to make sure the copy_from_user
can never overflow, keeping CONFIG_DEBUG_STRICT_USER_COPY_CHECKS happy:

   In function 'copy_from_user',
       inlined from '__tun_chr_ioctl' at drivers/net/tun.c:1871:7:
       ... copy_from_user() buffer size is not provably correct

Signed-off-by: Kees Cook <keescook@chromium.org>
---
 drivers/net/tun.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index acaaf6784179..a1f317cba206 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1855,7 +1855,7 @@ unlock:
 }
 
 static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
-			    unsigned long arg, int ifreq_len)
+			    unsigned long arg, const size_t ifreq_len)
 {
 	struct tun_file *tfile = file->private_data;
 	struct tun_struct *tun;
@@ -1869,6 +1869,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
 	int ret;
 
 	if (cmd == TUNSETIFF || cmd == TUNSETQUEUE || _IOC_TYPE(cmd) == 0x89) {
+		BUG_ON(ifreq_len > sizeof(ifr));
 		if (copy_from_user(&ifr, argp, ifreq_len))
 			return -EFAULT;
 	} else {
-- 
1.9.1


-- 
Kees Cook
Chrome OS Security

^ permalink raw reply related

* Re: [patch iproute2 1/2] add bridge_slave device support
From: Stephen Hemminger @ 2014-09-28 23:33 UTC (permalink / raw)
  To: Jiri Pirko; +Cc: netdev, davem, sfeldma, arvid.brodin, sucheta.chakraborty
In-Reply-To: <1409925309-17881-1-git-send-email-jiri@resnulli.us>

On Fri,  5 Sep 2014 15:55:08 +0200
Jiri Pirko <jiri@resnulli.us> wrote:

> Note this depends on "iproute2: allow to change slave options via
> type_slave"
> 
> Signed-off-by: Jiri Pirko <jiri@resnulli.us>

The iproute portion has to go in net-next not master branch of iproute2

^ permalink raw reply

* Connection timeout problem - keepalives or USER_TIMEOUT not working.
From: NeilBrown @ 2014-09-29  0:45 UTC (permalink / raw)
  To: netdev; +Cc: lkml, NFS, Benjamin ESTRABAUD

[-- Attachment #1: Type: text/plain, Size: 4706 bytes --]


Suppose I have a TCP connection to a remote machine and have configured TCP
keep-alive and the new TCP_USER_TIMEOUT so that the connection should close
after a few minutes of not being able to contact the server.

Suppose further that I change my local IP address and then write to the TCP
connection.

What should happen?


My first thought was that the keep-alive mechanism would not see a reply and
would close the connection.
TCP_KEEPIDLE and TCP_KEEPINTVL are both 60 seconds, KEEPCNT is 3.
So 3/4 minute should be all I have to wait ... but no.

Due to

	/* It is alive without keepalive 8) */
	if (tp->packets_out || tcp_send_head(sk))
		goto resched;

in tcp_keepalive_timer(), and due to tcp_send_head(sk) being non-NULL,
no keep-alives are sent (which is reasonable) and we never check if packets
have been received recently (which I'm less sure is reasonable).
I tried the patch below and it made a difference, but not quite the
difference I wanted ... I'll get back to that.

Then I found the TCP_USER_TIMEOUT socket opt.  That seemed to be exactly what
I wanted.  After all keep-alive is for keeping the connection alive when
nothing is being written.  I want to make it die even when something is..

So I tried setting TCP_USER_TIMEOUT to 60*3 as milliseconds, so 180,000.
No luck.

There are two places where icsk_user_timeout is considered.
One is in the keep-alive processing which, as discussed above, is disabled
when then it a packet on the way out.
The other is in tcp_write_timeout from tcp_retransmit_timer().  I don't know
why that isn't being called .. maybe the packet isn't being transmitted
because there is no local interface associated with that flow any more???
(tcp_write_wakeup returns -113: EHOSTUNREACH)

The connection eventually breaks after about 20 minutes thanks, I think, to
tcp_retries2.

Is there a bug here?  Where is it?  How can I get the connection to break?

This was discovered by mounting an NFSv3 filesystem (via tcp, the default),
changing the local IP address, and writing to an open file.
NFS sets the keep-alive to match the timeo and retrans option.
I added code to set TCP_USER_TIMEOUT as well.
+		unsigned int keeptotal =
+			jiffies_to_msecs(xprt->timeout->to_initval)
+			* keepcnt;
...
+		kernel_setsockopt(sock, SOL_TCP, TCP_USER_TIMEOUT,
+				  (char *)&keeptotal, sizeof(keeptotal));


Now I was going to tell you why this patch didn't do what I wanted.
With this patch, we don't bother sending a keep-alive if there are outstanding packets,
but it still triggers a timeout after the appropriate number of probes.
However icsk_probes_out increments much more quickly, thanks to tcp_send_probe0().
So this makes the timeout happen too soon.  I guess the confirms that the keep-alive timeout
should be considered irrelevant when there are pending outgoing packets??

Ahh.. Just had another thought.  I've added another patch at the end which might
be a bit closer to the "right" approach. Maybe.

Thanks,
NeilBrown

diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index df90cd1ce37f..51e8a89c7619 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -597,12 +597,6 @@ static void tcp_keepalive_timer (unsigned long data)
 	if (!sock_flag(sk, SOCK_KEEPOPEN) || sk->sk_state == TCP_CLOSE)
 		goto out;
 
-	elapsed = keepalive_time_when(tp);
-
-	/* It is alive without keepalive 8) */
-	if (tp->packets_out || tcp_send_head(sk))
-		goto resched;
-
 	elapsed = keepalive_time_elapsed(tp);
 
 	if (elapsed >= keepalive_time_when(tp)) {
@@ -618,7 +612,9 @@ static void tcp_keepalive_timer (unsigned long data)
 			tcp_write_err(sk);
 			goto out;
 		}
-		if (tcp_write_wakeup(sk) <= 0) {
+		if (tp->packets_out == 0 &&
+		    tcp_send_head(sk) == NULL &&
+		    tcp_write_wakeup(sk) <= 0) {
 			icsk->icsk_probes_out++;
 			elapsed = keepalive_intvl_when(tp);
 		} else {
@@ -634,7 +630,6 @@ static void tcp_keepalive_timer (unsigned long data)
 
 	sk_mem_reclaim(sk);
 
-resched:
 	inet_csk_reset_keepalive_timer (sk, elapsed);
 	goto out;
 



Other patch to extend effect of USER_TIMEOUT

diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index df90cd1ce37f..3158cc115a60 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -303,7 +303,8 @@ static void tcp_probe_timer(struct sock *sk)
 			return;
 	}
 
-	if (icsk->icsk_probes_out > max_probes) {
+	if (icsk->icsk_probes_out > max_probes ||
+	    (icsk->icsk_user_timeout && icsk->icsk_user_timeout < keepalive_time_elapsed(tp))) {
 		tcp_write_err(sk);
 	} else {
 		/* Only send another probe if we didn't close things up. */

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox