* Re: [PATCH] bgmac: driver for GBit MAC core on BCMA bus
From: Rafał Miłecki @ 2012-12-27 0:45 UTC (permalink / raw)
To: Francois Romieu; +Cc: netdev, David S. Miller
In-Reply-To: <20121226231721.GA8243@electric-eye.fr.zoreil.com>
Thanks for your comments, I'll improve the driver/patch.
2012/12/27 Francois Romieu <romieu@fr.zoreil.com>:
>> + struct device *dma_dev = bgmac->core->dma_dev;
>> + struct bgmac_dma_desc *dma_desc;
>> + struct bgmac_slot_info *slot;
>> + struct sk_buff *skb, *new_skb;
>> + struct bgmac_rx_header *rx;
>> + u32 end_slot;
>> + u16 len, flags;
>> + int handled = 0;
>
> The scope of several variables can be reduced as well.
I'm not 100% if I understand... Do you mean I should declare variables
inside "while" loop when possible? I couldn't find suggestions about
anywhere in Documentation, so please give me an extra work of
explanation :)
--
Rafał
^ permalink raw reply
* Re: [PATCH] bgmac: driver for GBit MAC core on BCMA bus
From: Francois Romieu @ 2012-12-26 23:17 UTC (permalink / raw)
To: Rafał Miłecki; +Cc: netdev, David S. Miller
In-Reply-To: <1356363222-16672-1-git-send-email-zajec5@gmail.com>
Rafał Miłecki <zajec5@gmail.com> :
[...]
> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
[...]
> +static void bgmac_dma_tx_reset(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
> +{
> + u32 val;
> + int i;
> +
> + if (!ring->mmio_base)
> + return;
static int bgmac_probe(struct bcma_device *core)
[...]
bgmac_chip_reset(bgmac);
err = bgmac_dma_alloc(bgmac);
mmio_base is only set in bgmac_dma_alloc.
-> remove the useless bgmac_chip_reset() in bgmac_probe() and the driver
won't need to test for !ring->mmio_base.
> +
> + /* Susend DMA TX ring first.
/* Suspend DMA TX ring first.
[...]
> +static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac,
> + struct bgmac_dma_ring *ring,
> + struct sk_buff *skb)
> +{
> + struct device *dma_dev = bgmac->core->dma_dev;
> + struct bgmac_dma_desc *dma_desc;
> + struct bgmac_slot_info *slot;
> + u32 ctl0, ctl1;
> + int free_slots;
> +
> + if (skb->len > BGMAC_DESC_CTL1_LEN) {
> + bgmac_err(bgmac, "Too long skb (%d)\n", skb->len);
> + return NETDEV_TX_BUSY;
> + }
The driver will loop if you don't stop queuing. It won't help.
> +
> + if (ring->start <= ring->end)
> + free_slots = ring->start - ring->end + BGMAC_TX_RING_SLOTS;
> + else
> + free_slots = ring->start - ring->end;
> + if (free_slots <= 1) {
> + bgmac_err(bgmac, "No free slots on ring 0x%X!\n", ring->mmio_base);
> + netif_stop_queue(bgmac->net_dev);
> + return NETDEV_TX_BUSY;
> + }
The driver should stop queueing after its processing if it detects that
it can't handle more requests.
> +
> + slot = &ring->slots[ring->end];
> + slot->skb = skb;
> + slot->dma_addr = dma_map_single(dma_dev, skb->data, skb->len, DMA_TO_DEVICE);
> + if (dma_mapping_error(dma_dev, slot->dma_addr)) {
> + bgmac_err(bgmac, "Mapping error of skb on ring 0x%X\n", ring->mmio_base);
> + return NETDEV_TX_BUSY;
> + }
Why don't you drop the packet and return TX_OK ?
> +
> + ctl0 = BGMAC_DESC_CTL0_IOC | BGMAC_DESC_CTL0_SOF | BGMAC_DESC_CTL0_EOF;
> + if (ring->end == ring->num_slots - 1)
> + ctl0 |= BGMAC_DESC_CTL0_EOT;
> + ctl1 = skb->len & BGMAC_DESC_CTL1_LEN;
> +
> + dma_desc = ring->cpu_base;
> + dma_desc += ring->end;
struct bgmac_dma_desc *dma_desc = ring->cpu_base + ring->end;
> + dma_desc->addr_low = cpu_to_le32(lower_32_bits(slot->dma_addr));
> + dma_desc->addr_high = cpu_to_le32(upper_32_bits(slot->dma_addr));
> + dma_desc->ctl0 = cpu_to_le32(ctl0);
> + dma_desc->ctl1 = cpu_to_le32(ctl1);
> +
> + wmb();
Are we sure that the hardware will never read a descriptor where ctl0 is
set and ctl1 is not (start_xmit, dma starts, competing start_xmit, oops) ?
> +
> + /* Increase ring->end to point empty slot. We tell hardware the first
> + * slot it shold *not* read.
* slot it should *not* read.
[...]
> +static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
> +{
> + struct device *dma_dev = bgmac->core->dma_dev;
> + struct bgmac_dma_desc *dma_desc;
The scope of 'slot' and 'dma_desc' can be reduced.
> + struct bgmac_slot_info *slot;
> + int empty_slot;
> +
> + /* The last slot that hardware didn't consume yet */
> + empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
> + empty_slot &= BGMAC_DMA_TX_STATDPTR;
> + empty_slot /= sizeof(struct bgmac_dma_desc);
> +
> + while (ring->start != empty_slot) {
> + /* Set pointers */
> + dma_desc = ring->cpu_base;
> + dma_desc += ring->start;
> + slot = &ring->slots[ring->start];
> +
> + if (slot->skb) {
> + /* Unmap no longer used buffer */
> + dma_unmap_single(dma_dev, slot->dma_addr,
> + slot->skb->len, DMA_TO_DEVICE);
> + slot->dma_addr = 0;
> +
> + /* Free memory! :) */
> + dev_kfree_skb_any(slot->skb);
This is irq enabled NAPI poll context so you can dev_kfree_skb.
> + slot->skb = NULL;
> + } else {
> + bgmac_err(bgmac, "Hardware reported transmission for empty TX ring slot %d! End of ring: %d", ring->start, ring->end);
> + }
> +
> + if (++ring->start >= BGMAC_TX_RING_SLOTS)
> + ring->start = 0;
> + }
> +}
> +
> +static void bgmac_dma_rx_reset(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
> +{
> + if (!ring->mmio_base)
> + return;
See remark about bgmac_dma_tx_reset.
[...]
> +static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
> + int weight)
> +{
> + struct device *dma_dev = bgmac->core->dma_dev;
> + struct bgmac_dma_desc *dma_desc;
> + struct bgmac_slot_info *slot;
> + struct sk_buff *skb, *new_skb;
> + struct bgmac_rx_header *rx;
> + u32 end_slot;
> + u16 len, flags;
> + int handled = 0;
The scope of several variables can be reduced as well.
--
Ueimor
^ permalink raw reply
* Re: [PATCH 1/2] IB/rds: Correct ib_api use with gs_dma_address/sg_dma_len
From: David Miller @ 2012-12-26 23:21 UTC (permalink / raw)
To: bvanassche-HInyCGIudOg
Cc: mike.marciniszyn-ral2JQCrhuEAvxtiuMwx3w,
venkat.x.venkatsubra-QHcLZuEGTsvQT0dZR+AlfA,
linux-rdma-u79uwXL29TY76Z2rM5mHXA, roland-DgEjT+Ai2ygdnm+yROfE0A,
rds-devel-N0ozoZBvEnrZJqsBc5GL+g, netdev-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <50D997D0.2020004-HInyCGIudOg@public.gmane.org>
From: Bart Van Assche <bvanassche-HInyCGIudOg@public.gmane.org>
Date: Tue, 25 Dec 2012 13:10:56 +0100
> The above patch will slow down RDS for anyone who is not using QLogic
> HCA's, isn' it ? How about replacing the above patch with the
> (untested) patch below ?
I agree with your suggestion but do this kind of simplification in
the next merge window, not now.
That's why I applied Mike's patches as-is.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 2/2] ipv6/ip6_gre: set transport header correctly
From: David Miller @ 2012-12-26 23:20 UTC (permalink / raw)
To: yamahata; +Cc: netdev
In-Reply-To: <8b3ad21951fd0ab05910ce5d4f4646142b18663a.1356403806.git.yamahata@valinux.co.jp>
From: Isaku Yamahata <yamahata@valinux.co.jp>
Date: Tue, 25 Dec 2012 11:51:04 +0900
> ip6gre_xmit2() incorrectly sets transport header to inner payload
> instead of GRE header. It seems copy-and-pasted from ipip.c.
> Set transport header to gre header.
> (In ipip case the transport header is the inner ip header, so that's
> correct.)
>
> Found by inspection. In practice the incorrect transport header
> doesn't matter because the skb usually is sent to another net_device
> or socket, so the transport header isn't referenced.
>
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Applied.
^ permalink raw reply
* Re: [PATCH 1/2] ipv4/ip_gre: set transport header correctly to gre header
From: David Miller @ 2012-12-26 23:20 UTC (permalink / raw)
To: yamahata; +Cc: netdev
In-Reply-To: <a6eb43766a3959d111cde14b237d435de0b19e15.1356403805.git.yamahata@valinux.co.jp>
From: Isaku Yamahata <yamahata@valinux.co.jp>
Date: Tue, 25 Dec 2012 11:51:03 +0900
> ipgre_tunnel_xmit() incorrectly sets transport header to inner payload
> instead of GRE header. It seems copy-and-pasted from ipip.c.
> So set transport header to gre header.
> (In ipip case the transport header is the inner ip header, so that's
> correct.)
>
> Found by inspection. In practice the incorrect transport header
> doesn't matter because the skb usually is sent to another net_device
> or socket, so the transport header isn't referenced.
>
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Applied.
^ permalink raw reply
* Re: [PATCH 2/2] IB/rds: suppress incompatible protocol when version is known
From: David Miller @ 2012-12-26 23:18 UTC (permalink / raw)
To: mike.marciniszyn
Cc: venkat.x.venkatsubra, linux-rdma, roland, rds-devel, netdev
In-Reply-To: <20121221180154.23716.44540.stgit@phlsvslse11.ph.intel.com>
From: Mike Marciniszyn <mike.marciniszyn@intel.com>
Date: Fri, 21 Dec 2012 13:01:54 -0500
> Add an else to only print the incompatible protocol message
> when version hasn't been established.
>
> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Applied.
^ permalink raw reply
* Re: [PATCH 1/2] IB/rds: Correct ib_api use with gs_dma_address/sg_dma_len
From: David Miller @ 2012-12-26 23:18 UTC (permalink / raw)
To: mike.marciniszyn
Cc: venkat.x.venkatsubra, linux-rdma, roland, rds-devel, netdev
In-Reply-To: <20121221180149.23716.54707.stgit@phlsvslse11.ph.intel.com>
From: Mike Marciniszyn <mike.marciniszyn@intel.com>
Date: Fri, 21 Dec 2012 13:01:49 -0500
> 0b088e00 ("RDS: Use page_remainder_alloc() for recv bufs")
> added uses of sg_dma_len() and sg_dma_address(). This makes
> RDS DOA with the qib driver.
>
> IB ulps should use ib_sg_dma_len() and ib_sg_dma_address
> respectively since some HCAs overload ib_sg_dma* operations.
>
> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Applied.
^ permalink raw reply
* Re: [PATCH V3.8 5/5] rtlwifi: rtl8723ae: Fix warning for unchecked pci_map_single() call
From: Larry Finger @ 2012-12-26 23:17 UTC (permalink / raw)
To: Eric Dumazet; +Cc: linville, linux-wireless, netdev
In-Reply-To: <1356563631.30414.3.camel@edumazet-glaptop>
On 12/26/2012 05:13 PM, Eric Dumazet wrote:
> On Wed, 2012-12-26 at 16:08 -0600, Larry Finger wrote:
>> Kernel 3.8 implements checking of all DMA mapping calls and issues
>> a WARNING for the first it finds that is not checked.
>>
>> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
>> ---
>> drivers/net/wireless/rtlwifi/rtl8723ae/trx.c | 12 ++++++++++++
>> 1 file changed, 12 insertions(+)
>>
>> diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
>> index 87331d8..7ddd517 100644
>> --- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
>> +++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
>> @@ -387,6 +387,12 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
>> PCI_DMA_TODEVICE);
>> u8 bw_40 = 0;
>>
>> + if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
>> + RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
>> + "DMA mapping error");
>> + return;
>> + }
>> + CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
>> if (mac->opmode == NL80211_IFTYPE_STATION) {
>> bw_40 = mac->bw_40;
>> } else if (mac->opmode == NL80211_IFTYPE_AP ||
>> @@ -542,6 +548,12 @@ void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
>> PCI_DMA_TODEVICE);
>> __le16 fc = hdr->frame_control;
>>
>> + if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
>> + RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
>> + "DMA mapping error");
>> + return;
>> + }
>> + CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
>> CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
>>
>> if (firstseg)
>
> This seems wrong...
>
> CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE) doesnt need to be done
> twice, does it ?
No it does not. That is a patching error
Thanks,
Larry
^ permalink raw reply
* Re: [PATCH BUGFIX] pkt_sched: fix little service anomalies and possible crashes of qfq+
From: David Miller @ 2012-12-26 23:13 UTC (permalink / raw)
To: paolo.valente; +Cc: jhs, shemminger, linux-kernel, netdev, rizzo, fchecconi
In-Reply-To: <1355938266-18459-1-git-send-email-paolo.valente@unimore.it>
From: Paolo valente <paolo.valente@unimore.it>
Date: Wed, 19 Dec 2012 18:31:06 +0100
> + /*
> + * The next assignment may let
> + * agg->initial_budget > agg->budgetmax
> + * hold, but this does not cause any harm
> + */
Please format comments in the networking:
/* Like
* this.
*/
and
/*
* Never
* like this.
*/
I know this file is full of exceptions, but that error is to be
corrected rather than expanded.
> + /*
> + * If lmax is lowered, through qfq_change_class, for a class
> + * owning pending packets with larger size than the new value of lmax,
> + * then the following condition may hold.
> + */
Likewise.
And I'm not applying this until someone familiar with this code
does some review of this patch. These are seriously non-trivial
changes.
^ permalink raw reply
* Re: [PATCH V3.8 5/5] rtlwifi: rtl8723ae: Fix warning for unchecked pci_map_single() call
From: Eric Dumazet @ 2012-12-26 23:13 UTC (permalink / raw)
To: Larry Finger; +Cc: linville, linux-wireless, netdev
In-Reply-To: <1356559691-5048-6-git-send-email-Larry.Finger@lwfinger.net>
On Wed, 2012-12-26 at 16:08 -0600, Larry Finger wrote:
> Kernel 3.8 implements checking of all DMA mapping calls and issues
> a WARNING for the first it finds that is not checked.
>
> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
> ---
> drivers/net/wireless/rtlwifi/rtl8723ae/trx.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
> index 87331d8..7ddd517 100644
> --- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
> +++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
> @@ -387,6 +387,12 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
> PCI_DMA_TODEVICE);
> u8 bw_40 = 0;
>
> + if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
> + RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
> + "DMA mapping error");
> + return;
> + }
> + CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
> if (mac->opmode == NL80211_IFTYPE_STATION) {
> bw_40 = mac->bw_40;
> } else if (mac->opmode == NL80211_IFTYPE_AP ||
> @@ -542,6 +548,12 @@ void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
> PCI_DMA_TODEVICE);
> __le16 fc = hdr->frame_control;
>
> + if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
> + RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
> + "DMA mapping error");
> + return;
> + }
> + CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
> CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
>
> if (firstseg)
This seems wrong...
CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE) doesnt need to be done
twice, does it ?
^ permalink raw reply
* Re: [PATCH] pkt_sched: act_xt support new Xtables interface
From: Pablo Neira Ayuso @ 2012-12-26 23:10 UTC (permalink / raw)
To: Jamal Hadi Salim
Cc: Felix Fietkau, Yury Stankevich, Hasan Chowdhury,
Stephen Hemminger, Jan Engelhardt, netdev@vger.kernel.org,
netfilter-devel
In-Reply-To: <20121224181943.GA16068@1984>
On Mon, Dec 24, 2012 at 07:19:43PM +0100, Pablo Neira Ayuso wrote:
> Hi Jamal,
>
> On Mon, Dec 24, 2012 at 09:05:42AM -0500, Jamal Hadi Salim wrote:
> > On 12-12-24 08:12 AM, Pablo Neira Ayuso wrote:
> > >
> > >conntrack needs to see defragmented packets, you have to call
> > >nf_defrag_ipv4 / _ipv6 respectively before that.
> > >
> >
> > This should not be too hard to do - although my thinking says this
> > should be a separate action.
> >
> > >This also changes the semantics of the raw table in iptables since it
> > >will now see packet with conntrack already attached. So this would
> > >also break -j CT --notrack.
> >
> > Is there a flag we can check which says a flow is not to be tracked?
> > Doesnt nf_conntrack_in() fail if --no track is set?
>
> The notrack dummy conntrack (consider it a flag) is attached in
> prerouting raw table. By attaching conntracks at ingress, the notrack
> flag will be ignored. Note that this also breaks conntrack templates
> via -j CT, that allows us to set custom conntrack timeouts, zones and
> helpers at prerouting raw.
>
> Basically, ct templates are attached via -j CT, this template is
> munched by nf_conntrack_in, which adds the corresponding ct features
> based on the template information.
I'm still spinning around this and I don't come with some easy
solution that doesn't break the existing semantics. One possibility
can be to drop the ct reference after leaving ingress, so the lookup
happens again in prerouting after the raw table to attach it again and
no ct is seen in the raw table but:
1) it's suboptimal in case users have rules using ct at ingress and in
iptables.
2) the conntrack template infrastructure needs to be reworked/replaced
by something more flexible to attach features to conntracks, so we
can still attach features for conntrack entries that were created
at ingress (so helpers / custom timeouts / notrack don't break).
^ permalink raw reply
* Re: [PATCH net] net/vxlan: Use the underlying device index when joining/leaving multicast groups
From: David Miller @ 2012-12-26 23:10 UTC (permalink / raw)
To: yanb; +Cc: shemminger, netdev, ogerlitz
In-Reply-To: <1356010568-21644-1-git-send-email-yanb@mellanox.com>
From: Yan Burman <yanb@mellanox.com>
Date: Thu, 20 Dec 2012 15:36:08 +0200
> The socket calls from vxlan to join/leave multicast group aren't
> using the index of the underlying device, as a result the stack uses
> the first interface that is up. This results in vxlan being non functional
> over a device which isn't the 1st to be up.
> Fix this by providing the iflink field to the vxlan instance
> to the multicast calls.
>
> Signed-off-by: Yan Burman <yanb@mellanox.com>
Applied, thanks.
^ permalink raw reply
* Re: [PATCH] tcp: should drop incoming frames without ACK flag set
From: David Miller @ 2012-12-26 23:09 UTC (permalink / raw)
To: eric.dumazet; +Cc: netdev, zhiyunq, nanditad, ncardwell, john.dykstra1
In-Reply-To: <1356561874.20133.21098.camel@edumazet-glaptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Wed, 26 Dec 2012 14:44:34 -0800
> [PATCH v2] tcp: should drop incoming frames without ACK flag set
>
> In commit 96e0bf4b5193d (tcp: Discard segments that ack data not yet
> sent) John Dykstra enforced a check against ack sequences.
>
> In commit 354e4aa391ed5 (tcp: RFC 5961 5.2 Blind Data Injection Attack
> Mitigation) I added more safety tests.
>
> But we missed fact that these tests are not performed if ACK bit is
> not set.
>
> RFC 793 3.9 mandates TCP should drop a frame without ACK flag set.
>
> " fifth check the ACK field,
> if the ACK bit is off drop the segment and return"
>
> Not doing so permits an attacker to only guess an acceptable sequence
> number, evading stronger checks.
>
> Many thanks to Zhiyun Qian for bringing this issue to our attention.
>
> See :
> http://web.eecs.umich.edu/~zhiyunq/pub/ccs12_TCP_sequence_number_inference.pdf
>
> Reported-by: Zhiyun Qian <zhiyunq@umich.edu>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied, thanks Eric.
^ permalink raw reply
* Re: [PATCH] tcp: should drop incoming frames without ACK flag set
From: Eric Dumazet @ 2012-12-26 22:44 UTC (permalink / raw)
To: David Miller; +Cc: netdev, zhiyunq, nanditad, ncardwell, john.dykstra1
In-Reply-To: <20121226.141154.115080358245263295.davem@davemloft.net>
From: Eric Dumazet <edumazet@google.com>
On Wed, 2012-12-26 at 14:11 -0800, David Miller wrote:
> From: Eric Dumazet <eric.dumazet@gmail.com>
> Date: Wed, 26 Dec 2012 09:10:01 -0800
>
> > @@ -5540,6 +5540,9 @@ no_ack:
> > }
> >
> > slow_path:
> > + if (!th->ack)
> > + goto discard;
>
> One too many tabs there on that last line :-)
Hmm, yes :(
>
> > +
> > if (len < (th->doff << 2) || tcp_checksum_complete_user(sk, skb))
> > goto csum_error;
> >
> > @@ -5551,7 +5554,7 @@ slow_path:
>
>
> Also, I would say that this checksum test should come first, because
> that takes priority since you could be testing the ACK bit of a
> corrupted packet.
>
> Better to get the statistic bump on the bad checksum then a silent
> drop on the ACK being cleared.
Indeed, good catch.
>
> > @@ -5984,11 +5987,15 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
> > if (tcp_check_req(sk, skb, req, NULL, true) == NULL)
> > goto discard;
> > }
> > +
> > + if (!th->ack)
> > + goto discard;
> > +
>
> And that is effectively what is going to happen in this case since
> the caller has already done the checksum checks.
>
That makes perfect sense.
Thanks !
[PATCH v2] tcp: should drop incoming frames without ACK flag set
In commit 96e0bf4b5193d (tcp: Discard segments that ack data not yet
sent) John Dykstra enforced a check against ack sequences.
In commit 354e4aa391ed5 (tcp: RFC 5961 5.2 Blind Data Injection Attack
Mitigation) I added more safety tests.
But we missed fact that these tests are not performed if ACK bit is
not set.
RFC 793 3.9 mandates TCP should drop a frame without ACK flag set.
" fifth check the ACK field,
if the ACK bit is off drop the segment and return"
Not doing so permits an attacker to only guess an acceptable sequence
number, evading stronger checks.
Many thanks to Zhiyun Qian for bringing this issue to our attention.
See :
http://web.eecs.umich.edu/~zhiyunq/pub/ccs12_TCP_sequence_number_inference.pdf
Reported-by: Zhiyun Qian <zhiyunq@umich.edu>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Nandita Dukkipati <nanditad@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: John Dykstra <john.dykstra1@gmail.com>
---
V2: moves the th->ack check after checksum one
net/ipv4/tcp_input.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index a136925..a28e4db 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -5543,6 +5543,9 @@ slow_path:
if (len < (th->doff << 2) || tcp_checksum_complete_user(sk, skb))
goto csum_error;
+ if (!th->ack)
+ goto discard;
+
/*
* Standard slow path.
*/
@@ -5551,7 +5554,7 @@ slow_path:
return 0;
step5:
- if (th->ack && tcp_ack(sk, skb, FLAG_SLOWPATH) < 0)
+ if (tcp_ack(sk, skb, FLAG_SLOWPATH) < 0)
goto discard;
/* ts_recent update must be made after we are sure that the packet
@@ -5984,11 +5987,15 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
if (tcp_check_req(sk, skb, req, NULL, true) == NULL)
goto discard;
}
+
+ if (!th->ack)
+ goto discard;
+
if (!tcp_validate_incoming(sk, skb, th, 0))
return 0;
/* step 5: check the ACK field */
- if (th->ack) {
+ if (true) {
int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH) > 0;
switch (sk->sk_state) {
@@ -6138,8 +6145,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
}
break;
}
- } else
- goto discard;
+ }
/* ts_recent update must be made after we are sure that the packet
* is in window.
^ permalink raw reply related
* Re: [PATCH] bgmac: driver for GBit MAC core on BCMA bus
From: Joe Perches @ 2012-12-26 22:24 UTC (permalink / raw)
To: Rafał Miłecki; +Cc: netdev, David S. Miller
In-Reply-To: <1356363222-16672-1-git-send-email-zajec5@gmail.com>
On Mon, 2012-12-24 at 16:33 +0100, Rafał Miłecki wrote:
> BCMA is a Broadcom specific bus with devices AKA cores. All recent BCMA
> based SoCs have gigabit ethernet provided by the GBit MAC core. This
> patch adds driver for such a cores registering itself as a netdev. It
> has been tested on a BCM4706 and BCM4718 chipsets.
Just a trivial note:
> diff --git a/drivers/net/ethernet/broadcom/bgmac.h b/drivers/net/ethernet/broadcom/bgmac.h
[]
> @@ -0,0 +1,443 @@
> +#ifndef _BGMAC_H
> +#define _BGMAC_H
> +
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
> +#define bgmac_err(bgmac, fmt, ...) \
> + pr_err("u%d: " fmt, (bgmac)->core->core_unit, ##__VA_ARGS__)
> +#define bgmac_warn(bgmac, fmt, ...) \
> + pr_warn("u%d: " fmt, (bgmac)->core->core_unit, ##__VA_ARGS__)
> +#define bgmac_info(bgmac, fmt, ...) \
> + pr_info("u%d: " fmt, (bgmac)->core->core_unit, ##__VA_ARGS__)
> +#define bgmac_dbg(bgmac, fmt, ...) \
> + pr_debug("u%d: " fmt, (bgmac)->core->core_unit, ##__VA_ARGS__)
Maybe all the bgmac_<level> macros should be:
dev_<level>(&bgmac->core->dev, "u%d: " fmt,
(bgmac)->core->core_unit, ##__VA_ARGS)
or maybe a new function like below if you use
a lot of these to decrease object size a little.
int bgmac_printk(const char *level, const struct bgmac *bgmac,
const char *fmt, ...)
{
struct va_format vaf;
va_list args;
int r;
va_start(args, fmt);
vaf.fmt = fmt;
vaf.va = &args;
r = dev_printk(&bgmac->core->dev, "u%d: %pV",
bgmac->core->core_unit, &vaf);
va_end(args);
return r;
}
^ permalink raw reply
* Re: [PATCH] netprio_cgroup: define sk_cgrp_prioidx only if NETPRIO_CGROUP is enabled
From: David Miller @ 2012-12-26 22:16 UTC (permalink / raw)
To: nhorman-2XuSBdqkA4R54TAoqtyWWQ
Cc: lizefan-hv44wF8Li93QT0dZR+AlfA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA, cgroups-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <20121226180339.GB10793-0o1r3XBGOEbbgkc5XkKeNuvMHUBZFtU3YPYVAmT7z5s@public.gmane.org>
From: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
Date: Wed, 26 Dec 2012 13:03:39 -0500
> On Wed, Dec 26, 2012 at 02:48:24PM +0800, Li Zefan wrote:
>> sock->sk_cgrp_prioidx won't be used at all if CONFIG_NETPRIO_CGROUP=n.
>>
>> Signed-off-by: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
> Acked-by: Neil Horman <nhorman-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
Applied, thanks.
^ permalink raw reply
* Re: [PATCH v2 0/2] cpts fixes for v3.8-rc2
From: David Miller @ 2012-12-26 22:15 UTC (permalink / raw)
To: richardcochran
Cc: netdev, linux-arm-kernel, linux-omap, cyril, mugunthanvnm,
sshtylyov
In-Reply-To: <cover.1356331925.git.richardcochran@gmail.com>
From: Richard Cochran <richardcochran@gmail.com>
Date: Mon, 24 Dec 2012 08:19:08 +0100
> Changed in v2:
> Use clk_prepare_enable instead of clk_prepare + clk_enable.
>
> The new cpts driver has two small issues, but it otherwise seems to be
> working in -rc1.
Both applied, thanks.
^ permalink raw reply
* Re: [PATCH] batman-adv: fix random jitter calculation
From: David Miller @ 2012-12-26 22:13 UTC (permalink / raw)
To: akinobu.mita
Cc: linux-kernel, netdev, lindner_marek, siwu, ordex, b.a.t.m.a.n
In-Reply-To: <1356525130-2688-1-git-send-email-akinobu.mita@gmail.com>
From: Akinobu Mita <akinobu.mita@gmail.com>
Date: Wed, 26 Dec 2012 21:32:10 +0900
> batadv_iv_ogm_emit_send_time() attempts to calculates a random integer
> in the range of 'orig_interval +- BATADV_JITTER' by the below lines.
>
> msecs = atomic_read(&bat_priv->orig_interval) - BATADV_JITTER;
> msecs += (random32() % 2 * BATADV_JITTER);
>
> But it actually gets 'orig_interval' or 'orig_interval - BATADV_JITTER'
> because '%' and '*' have same precedence and associativity is
> left-to-right.
>
> This adds the parentheses at the appropriate position so that it matches
> original intension.
>
> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> Acked-by: Antonio Quartulli <ordex@autistici.org>
Applied, thanks.
^ permalink raw reply
* Re: [PATCH] tcp: should drop incoming frames without ACK flag set
From: David Miller @ 2012-12-26 22:11 UTC (permalink / raw)
To: eric.dumazet; +Cc: netdev, zhiyunq, nanditad, ncardwell, john.dykstra1
In-Reply-To: <1356541801.20133.20615.camel@edumazet-glaptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Wed, 26 Dec 2012 09:10:01 -0800
> @@ -5540,6 +5540,9 @@ no_ack:
> }
>
> slow_path:
> + if (!th->ack)
> + goto discard;
One too many tabs there on that last line :-)
> +
> if (len < (th->doff << 2) || tcp_checksum_complete_user(sk, skb))
> goto csum_error;
>
> @@ -5551,7 +5554,7 @@ slow_path:
Also, I would say that this checksum test should come first, because
that takes priority since you could be testing the ACK bit of a
corrupted packet.
Better to get the statistic bump on the bad checksum then a silent
drop on the ACK being cleared.
> @@ -5984,11 +5987,15 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
> if (tcp_check_req(sk, skb, req, NULL, true) == NULL)
> goto discard;
> }
> +
> + if (!th->ack)
> + goto discard;
> +
And that is effectively what is going to happen in this case since
the caller has already done the checksum checks.
Thanks.
^ permalink raw reply
* Re: [PATCH] netfilter: Don't leak 'exp' in ctnetlink_create_expect()
From: Pablo Neira Ayuso @ 2012-12-26 22:09 UTC (permalink / raw)
To: Jesper Juhl
Cc: netfilter, linux-kernel, netdev, coreteam, netfilter-devel,
David S. Miller, Patrick McHardy, Jay Schulist, Harald Welte
In-Reply-To: <alpine.LNX.2.00.1212262246390.23814@swampdragon.chaosbits.net>
On Wed, Dec 26, 2012 at 10:49:40PM +0100, Jesper Juhl wrote:
> 'if ((!help) && (!cda[CTA_EXPECT_TIMEOUT]))' then we should remember
> to free 'exp' that was allocated by 'nf_ct_expect_alloc()' by jumping
> to the 'err_out' label rather than the 'out' label in
> ctnetlink_create_expect().
> This patch should get rid of the leak.
Applied, thanks Jesper.
^ permalink raw reply
* [PATCH V3.8 5/5] rtlwifi: rtl8723ae: Fix warning for unchecked pci_map_single() call
From: Larry Finger @ 2012-12-26 22:08 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Larry Finger, netdev
In-Reply-To: <1356559691-5048-1-git-send-email-Larry.Finger@lwfinger.net>
Kernel 3.8 implements checking of all DMA mapping calls and issues
a WARNING for the first it finds that is not checked.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
drivers/net/wireless/rtlwifi/rtl8723ae/trx.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
index 87331d8..7ddd517 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
@@ -387,6 +387,12 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
PCI_DMA_TODEVICE);
u8 bw_40 = 0;
+ if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+ "DMA mapping error");
+ return;
+ }
+ CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
if (mac->opmode == NL80211_IFTYPE_STATION) {
bw_40 = mac->bw_40;
} else if (mac->opmode == NL80211_IFTYPE_AP ||
@@ -542,6 +548,12 @@ void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
PCI_DMA_TODEVICE);
__le16 fc = hdr->frame_control;
+ if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+ "DMA mapping error");
+ return;
+ }
+ CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
if (firstseg)
--
1.7.10.4
^ permalink raw reply related
* [PATCH V3.8 3/5] rtlwifi: rtl8192de: Fix warning for unchecked pci_map_single() call
From: Larry Finger @ 2012-12-26 22:08 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Larry Finger, netdev
In-Reply-To: <1356559691-5048-1-git-send-email-Larry.Finger@lwfinger.net>
Kernel 3.8 implements checking of all DMA mapping calls and issues
a WARNING for the first it finds that is not checked.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
drivers/net/wireless/rtlwifi/rtl8192de/trx.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
index f9f3861..a0fbf28 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
@@ -587,6 +587,11 @@ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
buf_len = skb->len;
mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
PCI_DMA_TODEVICE);
+ if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+ "DMA mapping error");
+ return;
+ }
CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_92d));
if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
firstseg = true;
@@ -740,6 +745,11 @@ void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw,
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
__le16 fc = hdr->frame_control;
+ if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+ "DMA mapping error");
+ return;
+ }
CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
if (firstseg)
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
--
1.7.10.4
^ permalink raw reply related
* [PATCH V3.8 2/5] rtlwifi: rtl8192ce: Fix warning for unchecked pci_map_single() call
From: Larry Finger @ 2012-12-26 22:08 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Larry Finger, netdev
In-Reply-To: <1356559691-5048-1-git-send-email-Larry.Finger@lwfinger.net>
Kernel 3.8 implements checking of all DMA mapping calls and issues
a WARNING for the first it finds that is not checked.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
index 1734247..c31795e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
@@ -611,8 +611,14 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
dma_addr_t mapping = pci_map_single(rtlpci->pdev,
skb->data, skb->len,
PCI_DMA_TODEVICE);
+
u8 bw_40 = 0;
+ if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+ "DMA mapping error");
+ return;
+ }
rcu_read_lock();
sta = get_sta(hw, mac->vif, mac->bssid);
if (mac->opmode == NL80211_IFTYPE_STATION) {
@@ -774,6 +780,11 @@ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
__le16 fc = hdr->frame_control;
+ if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+ "DMA mapping error");
+ return;
+ }
CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
if (firstseg)
--
1.7.10.4
^ permalink raw reply related
* [PATCH V3.8 1/5] rtlwifi: Fix warning for unchecked pci_map_single() call
From: Larry Finger @ 2012-12-26 22:08 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, Larry Finger, netdev
In-Reply-To: <1356559691-5048-1-git-send-email-Larry.Finger@lwfinger.net>
Kernel 3.8 implements checking of all DMA mapping calls and issues
a WARNING for the first it finds that is not checked.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---
drivers/net/wireless/rtlwifi/pci.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 3deacaf..4261e8e 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -743,6 +743,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
done:
bufferaddress = (*((dma_addr_t *)skb->cb));
+ if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
+ return;
tmp_one = 1;
rtlpriv->cfg->ops->set_desc((u8 *) pdesc, false,
HW_DESC_RXBUFF_ADDR,
@@ -1115,6 +1117,10 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw)
PCI_DMA_FROMDEVICE);
bufferaddress = (*((dma_addr_t *)skb->cb));
+ if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) {
+ dev_kfree_skb_any(skb);
+ return 1;
+ }
rtlpriv->cfg->ops->set_desc((u8 *)entry, false,
HW_DESC_RXBUFF_ADDR,
(u8 *)&bufferaddress);
--
1.7.10.4
^ permalink raw reply related
* [PATCH V3.8 4/5] rtlwifi: rtl8192se: Fix warning for unchecked pci_map_single() call
From: Larry Finger @ 2012-12-26 22:08 UTC (permalink / raw)
To: linville-2XuSBdqkA4R54TAoqtyWWQ
Cc: linux-wireless-u79uwXL29TY76Z2rM5mHXA, Larry Finger,
netdev-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1356559691-5048-1-git-send-email-Larry.Finger-tQ5ms3gMjBLk1uMJSBkQmQ@public.gmane.org>
Kernel 3.8 implements checking of all DMA mapping calls and issues
a WARNING for the first it finds that is not checked.
Signed-off-by: Larry Finger <Larry.Finger-tQ5ms3gMjBLk1uMJSBkQmQ@public.gmane.org>
---
drivers/net/wireless/rtlwifi/rtl8192se/trx.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
index 0e9f6eb..206561d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
@@ -611,6 +611,11 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
PCI_DMA_TODEVICE);
u8 bw_40 = 0;
+ if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+ "DMA mapping error");
+ return;
+ }
if (mac->opmode == NL80211_IFTYPE_STATION) {
bw_40 = mac->bw_40;
} else if (mac->opmode == NL80211_IFTYPE_AP ||
@@ -763,6 +768,7 @@ void rtl92se_tx_fill_desc(struct ieee80211_hw *hw,
void rtl92se_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
bool firstseg, bool lastseg, struct sk_buff *skb)
{
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
struct rtl_tcb_desc *tcb_desc = (struct rtl_tcb_desc *)(skb->cb);
@@ -770,7 +776,12 @@ void rtl92se_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
dma_addr_t mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
PCI_DMA_TODEVICE);
- /* Clear all status */
+ if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
+ RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
+ "DMA mapping error");
+ return;
+ }
+ /* Clear all status */
CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_CMDDESC_SIZE_RTL8192S);
/* This bit indicate this packet is used for FW download. */
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox