* [PATCH] libertas: Remove unused exports
From: Roland Dreier @ 2008-02-12 23:08 UTC (permalink / raw)
To: John W. Linville; +Cc: netdev, Dan Williams
In-Reply-To: <adatzkj0z7l.fsf@cisco.com>
The libertas driver exports a number of symbols with no in-tree
users; remove these unused exports. lbs_reset_device() is completely
unused, with no callers at all, so remove the function completely.
A couple of these unused exported symbols are static, which causes the
following build error on ia64 with gcc 4.2.3:
drivers/net/wireless/libertas/main.c:1375: error: __ksymtab_lbs_remove_mesh causes a section type conflict
drivers/net/wireless/libertas/main.c:1354: error: __ksymtab_lbs_add_mesh causes a section type conflict
This patch fixes this problem. I don't have hardware, so this is not
run-tested, but I tested the build with
CONFIG_LIBERTAS=y
CONFIG_LIBERTAS_USB=m
CONFIG_LIBERTAS_CS=m
CONFIG_LIBERTAS_SDIO=m
and there were no problems with undefined symbols.
Signed-off-by: Roland Dreier <rolandd@cisco.com>
---
Here's the patch that removes the unused exports (and a few more that
I found).
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index eab0203..b3c1acb 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1040,7 +1040,6 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
lbs_deb_leave(LBS_DEB_CMD);
return ret;
}
-EXPORT_SYMBOL_GPL(lbs_mesh_access);
int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan)
{
@@ -1576,7 +1575,6 @@ done:
lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
return ret;
}
-EXPORT_SYMBOL_GPL(lbs_prepare_and_send_command);
/**
* @brief This function allocates the command buffer and link
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index aaacd9b..4e22341 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -69,7 +69,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev);
int lbs_remove_card(struct lbs_private *priv);
int lbs_start_card(struct lbs_private *priv);
int lbs_stop_card(struct lbs_private *priv);
-int lbs_reset_device(struct lbs_private *priv);
void lbs_host_to_card_done(struct lbs_private *priv);
int lbs_update_channel(struct lbs_private *priv);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 84fb49c..1eaf6af 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1351,8 +1350,6 @@ done:
lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret);
return ret;
}
-EXPORT_SYMBOL_GPL(lbs_add_mesh);
-
static void lbs_remove_mesh(struct lbs_private *priv)
{
@@ -1372,7 +1369,6 @@ static void lbs_remove_mesh(struct lbs_private *priv)
free_netdev(mesh_dev);
lbs_deb_leave(LBS_DEB_MESH);
}
-EXPORT_SYMBOL_GPL(lbs_remove_mesh);
/**
* @brief This function finds the CFP in
@@ -1458,20 +1454,6 @@ void lbs_interrupt(struct lbs_private *priv)
}
EXPORT_SYMBOL_GPL(lbs_interrupt);
-int lbs_reset_device(struct lbs_private *priv)
-{
- int ret;
-
- lbs_deb_enter(LBS_DEB_MAIN);
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_RESET,
- CMD_ACT_HALT, 0, 0, NULL);
- msleep_interruptible(10);
-
- lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
- return ret;
-}
-EXPORT_SYMBOL_GPL(lbs_reset_device);
-
static int __init lbs_init_module(void)
{
lbs_deb_enter(LBS_DEB_MAIN);
^ permalink raw reply related
* [PATCH] e1000e: Fix CRC stripping in hardware context bug
From: Auke Kok @ 2008-02-12 23:20 UTC (permalink / raw)
To: jeff; +Cc: e1000-devel, netdev, andy, johan.andersson
CRC stripping was only correctly enabled for packet split recieves
which is used when receiving jumbo frames. Correctly enable SECRC
also for normal buffer packet receives.
Tested by Andy Gospodarek and Johan Andersson, see bugzilla #9940.
Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
---
drivers/net/e1000e/netdev.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index b9b0d32..ea4ecc3 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -1690,6 +1690,9 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
else
rctl |= E1000_RCTL_LPE;
+ /* Enable hardware CRC frame stripping */
+ rctl |= E1000_RCTL_SECRC;
+
/* Setup buffer sizes */
rctl &= ~E1000_RCTL_SZ_4096;
rctl |= E1000_RCTL_BSEX;
@@ -1755,9 +1758,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
/* Enable Packet split descriptors */
rctl |= E1000_RCTL_DTYP_PS;
-
- /* Enable hardware CRC frame stripping */
- rctl |= E1000_RCTL_SECRC;
psrctl |= adapter->rx_ps_bsize0 >>
E1000_PSRCTL_BSIZE0_SHIFT;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
^ permalink raw reply related
* [PATCH] ixgbe: Correctly obtain protocol information on transmit
From: Auke Kok @ 2008-02-12 23:20 UTC (permalink / raw)
To: jeff; +Cc: netdev, andy, e1000-devel
In reply to "RE: [Fwd: [PATCH 2.6.25] ixgbe/igb: correctly obtain protocol
information on transmit]" from Andy Gospodarek:
The driver was incorrectly looking at socket headers for
protocol information, needed for checksumming offload. Fix
this by not looking at the socket but frame headers instead.
This disregards extension headers but it's unclear that linux
generates those anyway.
Tested by Andy Gospodarek.
Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
---
drivers/net/ixgbe/ixgbe_main.c | 24 +++++++++++++++++++++---
1 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
index 540b647..23d0a4a 100644
--- a/drivers/net/ixgbe/ixgbe_main.c
+++ b/drivers/net/ixgbe/ixgbe_main.c
@@ -2277,11 +2277,29 @@ static bool ixgbe_tx_csum(struct ixgbe_adapter *adapter,
IXGBE_ADVTXD_DTYP_CTXT);
if (skb->ip_summed == CHECKSUM_PARTIAL) {
- if (skb->protocol == htons(ETH_P_IP))
+ switch (skb->protocol) {
+ case __constant_htons(ETH_P_IP):
type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
+ if (ip_hdr(skb)->protocol == IPPROTO_TCP)
+ type_tucmd_mlhl |=
+ IXGBE_ADVTXD_TUCMD_L4T_TCP;
+ break;
+
+ case __constant_htons(ETH_P_IPV6):
+ /* XXX what about other V6 headers?? */
+ if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
+ type_tucmd_mlhl |=
+ IXGBE_ADVTXD_TUCMD_L4T_TCP;
+ break;
- if (skb->sk->sk_protocol == IPPROTO_TCP)
- type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
+ default:
+ if (unlikely(net_ratelimit())) {
+ DPRINTK(PROBE, WARNING,
+ "partial checksum but proto=%x!\n",
+ skb->protocol);
+ }
+ break;
+ }
}
context_desc->type_tucmd_mlhl = cpu_to_le32(type_tucmd_mlhl);
^ permalink raw reply related
* RE: [PATCH resend] qla3xxx: convert byte order of constant instead ofvariable
From: Ron Mercer @ 2008-02-12 23:36 UTC (permalink / raw)
To: Marcin Slusarz, netdev, Linux Driver; +Cc: LKML
In-Reply-To: <20080210100546.GA6737@joi>
> -----Original Message-----
> From: Marcin Slusarz [mailto:marcin.slusarz@gmail.com]
> Sent: Sunday, February 10, 2008 2:06 AM
> To: netdev@vger.kernel.org; Linux Driver
> Cc: LKML
> Subject: [PATCH resend] qla3xxx: convert byte order of
> constant instead ofvariable
>
> convert byte order of constant instead of variable
> which can be done at compile time (vs run time)
>
> Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
> ---
> drivers/net/qla3xxx.c | 6 ++----
> 1 files changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c
> index a6aeb9d..b7f7b22 100644
> --- a/drivers/net/qla3xxx.c
> +++ b/drivers/net/qla3xxx.c
> @@ -2472,8 +2472,7 @@ static int ql_send_map(struct ql3_adapter *qdev,
>
> if (seg_cnt == 1) {
> /* Terminate the last segment. */
> - oal_entry->len =
> - cpu_to_le32(le32_to_cpu(oal_entry->len) |
> OAL_LAST_ENTRY);
> + oal_entry->len |= cpu_to_le32(OAL_LAST_ENTRY);
> } else {
> oal = tx_cb->oal;
> for (completed_segs=0; completed_segs<frag_cnt;
> completed_segs++,seg++) {
> @@ -2530,8 +2529,7 @@ static int ql_send_map(struct ql3_adapter *qdev,
> frag->size);
> }
> /* Terminate the last segment. */
> - oal_entry->len =
> - cpu_to_le32(le32_to_cpu(oal_entry->len) |
> OAL_LAST_ENTRY);
> + oal_entry->len |= cpu_to_le32(OAL_LAST_ENTRY);
> }
>
> return NETDEV_TX_OK;
> --
> 1.5.3.7
>
>
Thanks
Acked-by: Ron Mercer <ron.mercer@qlogic.com>
^ permalink raw reply
* [IPV6]: Fix IPsec datagram fragmentation
From: Herbert Xu @ 2008-02-13 0:04 UTC (permalink / raw)
To: David S. Miller, YOSHIFUJI Hideaki, netdev; +Cc: dlstevens, Kazunori Miyazawa
Hi Dave:
[IPV6]: Fix IPsec datagram fragmentation
This is a long-standing bug in the IPsec IPv6 code that breaks
when we emit a IPsec tunnel-mode datagram packet. The problem
is that the code the emits the packet assumes the IPv6 stack
will fragment it later, but the IPv6 stack assumes that whoever
is emitting the packet is going to pre-fragment the packet.
In the long term we need to fix both sides, e.g., to get the
datagram code to pre-fragment as well as to get the IPv6 stack
to fragment locally generated tunnel-mode packet.
For now this patch does the second part which should make it
work for the IPsec host case.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 9ac6ca2..4e9a2fe 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -621,7 +621,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
* or if the skb it not generated by a local socket. (This last
* check should be redundant, but it's free.)
*/
- if (!np || np->pmtudisc >= IPV6_PMTUDISC_DO) {
+ if (skb->local_df) {
skb->dev = skb->dst->dev;
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev);
IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS);
@@ -1420,6 +1420,10 @@ int ip6_push_pending_frames(struct sock *sk)
tmp_skb->sk = NULL;
}
+ /* Allow local fragmentation. */
+ if (np->pmtudisc >= IPV6_PMTUDISC_DO)
+ skb->local_df = 1;
+
ipv6_addr_copy(final_dst, &fl->fl6_dst);
__skb_pull(skb, skb_network_header_len(skb));
if (opt && opt->opt_flen)
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c
index b34c58c..79ccfb0 100644
--- a/net/ipv6/xfrm6_output.c
+++ b/net/ipv6/xfrm6_output.c
@@ -36,7 +36,7 @@ static int xfrm6_tunnel_check_size(struct sk_buff *skb)
if (mtu < IPV6_MIN_MTU)
mtu = IPV6_MIN_MTU;
- if (skb->len > mtu) {
+ if (!skb->local_df && skb->len > mtu) {
skb->dev = dst->dev;
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev);
ret = -EMSGSIZE;
^ permalink raw reply related
* Re: E1000 (PCI-E) doesn't work on nforce430, MSI issue.
From: Krzysztof Halasa @ 2008-02-13 0:05 UTC (permalink / raw)
To: Kok, Auke; +Cc: Prakash Punnoor, linux-kernel, netdev
In-Reply-To: <47B21C95.4050705@intel.com>
"Kok, Auke" <auke-jan.h.kok@intel.com> writes:
>>> Don't work by default. "pci=nomsi" fixes the problem.
>
> actually does not fix anything - it just works around it by falling
> back to legacy interrupts.
Actually it does, fixes the problem by working around a bug :-)
Thanks for info.
--
Krzysztof Halasa
^ permalink raw reply
* Re: [ofa-general] [PATCH 2.6.25] RDMA/cxgb3: Fail loopback connections.
From: Roland Dreier @ 2008-02-13 0:26 UTC (permalink / raw)
To: Steve Wise; +Cc: netdev, linux-kernel, general
In-Reply-To: <20080212220929.24442.76874.stgit@dell3.ogc.int>
applied, although:
> +static void is_loopback_dst(struct iw_cm_id *cm_id)
> +{
> + struct net_device *dev;
> +
> + dev = ip_dev_find(&init_net, cm_id->remote_addr.sin_addr.s_addr);
> + if (!dev)
> + return 0;
> + dev_put(dev);
> + return 1;
> +}
is there any way this could trigger when it should, like if I'm trying
to make a connection from one local device to a different local device
(which should work fine)?
- R.
^ permalink raw reply
* [PATCH 1/4] rcu_assign_pointer: null check fix
From: Stephen Hemminger @ 2008-02-13 0:50 UTC (permalink / raw)
To: David Miller; +Cc: linux-kernel, netdev
In-Reply-To: <20080213005042.150212716@vyatta.com>
[-- Attachment #1: rcu-assign-warn.patch --]
[-- Type: text/plain, Size: 637 bytes --]
Goofed on last change, should avoid barrier only on rcu_assign_pointer(p, NULL)
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
include/linux/rcupdate.h | 13 +++++++------
1 files changed, 7 insertions(+), 6 deletions(-)
--- a/include/linux/rcupdate.h 2008-02-12 14:46:49.000000000 -0800
+++ b/include/linux/rcupdate.h 2008-02-12 14:56:17.000000000 -0800
@@ -178,7 +178,7 @@ struct rcu_head {
#define rcu_assign_pointer(p, v) \
({ \
- if (!(__builtin_constant_p(v) && v)) \
+ if (!__builtin_constant_p(v) || v) \
smp_wmb(); \
(p) = (v); \
})
--
Stephen Hemminger <shemminger@vyatta.com>
^ permalink raw reply
* [PATCH 2/4] fib_trie: improve output format for /proc/net/fib_trie
From: Stephen Hemminger @ 2008-02-13 0:50 UTC (permalink / raw)
To: David Miller; +Cc: netdev
In-Reply-To: <20080213005042.150212716@vyatta.com>
[-- Attachment #1: fib-trie-format.patch --]
[-- Type: text/plain, Size: 5136 bytes --]
Make output format prettier (more tree like).
<local>:
--- 0.0.0.0/0
|--- 10.111.111.0/24
| +-- 10.111.111.0/32 link broadcast
| |--- 10.111.111.254/31
| | +-- 10.111.111.254/32 host local
| | +-- 10.111.111.255/32 link broadcast
|--- 127.0.0.0/8
| |--- 127.0.0.0/31
| | +-- 127.0.0.0/32 link broadcast
| | +-- 127.0.0.0/8 host local
| | +-- 127.0.0.1/32 host local
| +-- 127.255.255.255/32 link broadcast
|--- 192.168.1.0/24
| |--- 192.168.1.0/28
| | +-- 192.168.1.0/32 link broadcast
| | +-- 192.168.1.9/32 host local
| +-- 192.168.1.255/32 link broadcast
<main>:
--- 0.0.0.0/0
|--- 0.0.0.0/4
| +-- 0.0.0.0/0 universe unicast
| +-- 10.111.111.0/24 link unicast
+-- 169.254.0.0/16 link unicast
+-- 192.168.1.0/24 link unicast
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
net/ipv4/fib_trie.c | 106 ++++++++++++++++++++++++++------------------------
1 files changed, 55 insertions(+), 51 deletions(-)
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index 1ff446d..72338cd 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -2340,46 +2340,57 @@ static void fib_trie_seq_stop(struct seq_file *seq, void *v)
rcu_read_unlock();
}
+/* print left side of tree */
static void seq_indent(struct seq_file *seq, int n)
{
- while (n-- > 0) seq_puts(seq, " ");
-}
-
-static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s)
-{
- switch (s) {
- case RT_SCOPE_UNIVERSE: return "universe";
- case RT_SCOPE_SITE: return "site";
- case RT_SCOPE_LINK: return "link";
- case RT_SCOPE_HOST: return "host";
- case RT_SCOPE_NOWHERE: return "nowhere";
- default:
- snprintf(buf, len, "scope=%d", s);
- return buf;
- }
+ while (n-- > 0)
+ seq_puts(seq, " |");
}
static const char *rtn_type_names[__RTN_MAX] = {
- [RTN_UNSPEC] = "UNSPEC",
- [RTN_UNICAST] = "UNICAST",
- [RTN_LOCAL] = "LOCAL",
- [RTN_BROADCAST] = "BROADCAST",
- [RTN_ANYCAST] = "ANYCAST",
- [RTN_MULTICAST] = "MULTICAST",
- [RTN_BLACKHOLE] = "BLACKHOLE",
- [RTN_UNREACHABLE] = "UNREACHABLE",
- [RTN_PROHIBIT] = "PROHIBIT",
- [RTN_THROW] = "THROW",
- [RTN_NAT] = "NAT",
- [RTN_XRESOLVE] = "XRESOLVE",
+ [RTN_UNSPEC] = "unspec",
+ [RTN_UNICAST] = "unicast",
+ [RTN_LOCAL] = "local",
+ [RTN_BROADCAST] = "broadcast",
+ [RTN_ANYCAST] = "anycast",
+ [RTN_MULTICAST] = "multicast",
+ [RTN_BLACKHOLE] = "blackhole",
+ [RTN_UNREACHABLE] = "unreachable",
+ [RTN_PROHIBIT] = "prohibit",
+ [RTN_THROW] = "throw",
+ [RTN_NAT] = "nat",
+ [RTN_XRESOLVE] = "xresolve",
};
-static inline const char *rtn_type(char *buf, size_t len, unsigned t)
-{
- if (t < __RTN_MAX && rtn_type_names[t])
- return rtn_type_names[t];
- snprintf(buf, len, "type %u", t);
- return buf;
+static void fib_trie_show_alias(struct seq_file *seq, const struct fib_alias *fa)
+{
+ switch (fa->fa_scope) {
+ case RT_SCOPE_UNIVERSE:
+ seq_puts(seq, "universe");
+ break;
+ case RT_SCOPE_SITE:
+ seq_puts(seq, "site");
+ break;
+ case RT_SCOPE_LINK:
+ seq_puts(seq, "link");
+ break;
+ case RT_SCOPE_HOST:
+ seq_puts(seq, "host");
+ break;
+ case RT_SCOPE_NOWHERE:
+ seq_puts(seq, "nowhere");
+ break;
+ default:
+ seq_printf(seq, "scope:%d", fa->fa_scope);
+ }
+
+ if (fa->fa_type < __RTN_MAX && rtn_type_names[fa->fa_type])
+ seq_printf(seq, " %s", rtn_type_names[fa->fa_type]);
+ else
+ seq_printf(seq, " type:%u", fa->fa_type);
+
+ if (fa->fa_tos)
+ seq_printf(seq, " tos:%#x", fa->fa_tos);
}
/* Pretty print the trie */
@@ -2402,10 +2413,8 @@ static int fib_trie_seq_show(struct seq_file *seq, void *v)
struct tnode *tn = (struct tnode *) n;
__be32 prf = htonl(mask_pfx(tn->key, tn->pos));
- seq_indent(seq, iter->depth-1);
- seq_printf(seq, " +-- %d.%d.%d.%d/%d %d %d %d\n",
- NIPQUAD(prf), tn->pos, tn->bits, tn->full_children,
- tn->empty_children);
+ seq_indent(seq, iter->depth - 1);
+ seq_printf(seq, "--- %d.%d.%d.%d/%d\n", NIPQUAD(prf), tn->pos);
} else {
struct leaf *l = (struct leaf *) n;
@@ -2413,24 +2422,19 @@ static int fib_trie_seq_show(struct seq_file *seq, void *v)
struct hlist_node *node;
__be32 val = htonl(l->key);
- seq_indent(seq, iter->depth);
- seq_printf(seq, " |-- %d.%d.%d.%d\n", NIPQUAD(val));
-
hlist_for_each_entry_rcu(li, node, &l->list, hlist) {
struct fib_alias *fa;
+
+ seq_indent(seq, iter->depth - 1);
+ seq_printf(seq, " +-- %d.%d.%d.%d/%d ",
+ NIPQUAD(val), li->plen);
list_for_each_entry_rcu(fa, &li->falh, fa_list) {
- char buf1[32], buf2[32];
-
- seq_indent(seq, iter->depth+1);
- seq_printf(seq, " /%d %s %s", li->plen,
- rtn_scope(buf1, sizeof(buf1),
- fa->fa_scope),
- rtn_type(buf2, sizeof(buf2),
- fa->fa_type));
- if (fa->fa_tos)
- seq_printf(seq, " tos=%d", fa->fa_tos);
- seq_putc(seq, '\n');
+ fib_trie_show_alias(seq, fa);
+ if (list_is_last(&fa->fa_list, &li->falh))
+ seq_putc(seq, '\n');
+ else
+ seq_puts(seq, ", ");
}
}
}
--
1.5.3.8
--
Stephen Hemminger <shemminger@vyatta.com>
^ permalink raw reply related
* Re: [PATCH 4/4] hlist_for_each_entry_continue simplification
From: David Miller @ 2008-02-13 1:26 UTC (permalink / raw)
To: shemminger; +Cc: paulmck, netdev, linux-kernel
In-Reply-To: <20080213005122.879352336@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Tue, 12 Feb 2008 16:50:46 -0800
> All the users of hlist_for_each_entry_continue had to intialize pos
> before use; change API so pos is a pure temporary variable which matches
> the usage of other xxxx_for_each_entry routines.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
linux/list.h changes need to be reviewed on linux-kernel and
merged into Linus's tree via some means other than the
networking tree.
I just got chewed out for a similar issue wrt. the rcupdate.h
changes of yesterday and thus have to remove them from my
tree.
^ permalink raw reply
* Re: [PATCH 1/4] rcu_assign_pointer: null check fix
From: David Miller @ 2008-02-13 1:27 UTC (permalink / raw)
To: shemminger; +Cc: linux-kernel, netdev
In-Reply-To: <20080213005122.653836965@vyatta.com>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Tue, 12 Feb 2008 16:50:43 -0800
> Goofed on last change, should avoid barrier only on rcu_assign_pointer(p, NULL)
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Like the original change this needs to be merged upstream outside of
the networking tree, sorry.
^ permalink raw reply
* [PATCH BUGFIX 25-rc1] Smack: Don't fail against Nulled sk sockets
From: Ahmed S. Darwish @ 2008-02-13 1:25 UTC (permalink / raw)
To: Andrew Morton, Linus Torvalds; +Cc: Casey Schaufler, Joerg Platte, LKML, Netdev
Hi!,
Appropriately handle sockets with sk = NULL. This is usually the socket
case when starting kernel nfsd.
Signed-off-by: Ahmed S. Darwish <darwish.07@gmail.com>
Acked-by: Casey Schaufler <casey@schuafler-ca.com>
Tested-by: Joerg Platte <jplatte@naasa.net>
--
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index 1c11e42..eb04278 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -701,7 +701,7 @@ static int smack_inode_getsecurity(const struct inode *inode,
return -EOPNOTSUPP;
sock = SOCKET_I(ip);
- if (sock == NULL)
+ if (sock == NULL || sock->sk == NULL)
return -EOPNOTSUPP;
ssp = sock->sk->sk_security;
@@ -1280,10 +1280,12 @@ static void smack_to_secattr(char *smack, struct netlbl_lsm_secattr *nlsp)
*/
static int smack_netlabel(struct sock *sk)
{
- struct socket_smack *ssp = sk->sk_security;
+ struct socket_smack *ssp;
struct netlbl_lsm_secattr secattr;
int rc = 0;
+ BUG_ON(sk == NULL);
+ ssp = sk->sk_security;
netlbl_secattr_init(&secattr);
smack_to_secattr(ssp->smk_out, &secattr);
if (secattr.flags != NETLBL_SECATTR_NONE)
@@ -1331,7 +1333,7 @@ static int smack_inode_setsecurity(struct inode *inode, const char *name,
return -EOPNOTSUPP;
sock = SOCKET_I(inode);
- if (sock == NULL)
+ if (sock == NULL || sock->sk == NULL)
return -EOPNOTSUPP;
ssp = sock->sk->sk_security;
@@ -1362,7 +1364,7 @@ static int smack_inode_setsecurity(struct inode *inode, const char *name,
static int smack_socket_post_create(struct socket *sock, int family,
int type, int protocol, int kern)
{
- if (family != PF_INET)
+ if (family != PF_INET || sock->sk == NULL)
return 0;
/*
* Set the outbound netlbl.
Warm regards
--
Ahmed S. Darwish
Homepage: http://darwish.07.googlepages.com
Blog: http://darwish-07.blogspot.com
^ permalink raw reply related
* Re: [ofa-general] [PATCH 2.6.25] RDMA/cxgb3: Fail loopback connections.
From: Steve Wise @ 2008-02-13 1:41 UTC (permalink / raw)
To: Roland Dreier; +Cc: netdev, linux-kernel, general
In-Reply-To: <adafxvxvgz3.fsf@cisco.com>
Roland Dreier wrote:
> applied, although:
>
> > +static void is_loopback_dst(struct iw_cm_id *cm_id)
> > +{
> > + struct net_device *dev;
> > +
> > + dev = ip_dev_find(&init_net, cm_id->remote_addr.sin_addr.s_addr);
> > + if (!dev)
> > + return 0;
> > + dev_put(dev);
> > + return 1;
> > +}
>
> is there any way this could trigger when it should, like if I'm trying
> to make a connection from one local device to a different local device
> (which should work fine)?
>
As far as I can tell, if the app does a rdma_resolve_addr() on the dst
addr (which is a local address), then the routing lookup will find the
local interface with that dst addr, and that device will be used for the
connect. IE src and dst devices are the same.
Maybe if the app does an explicit bind to the addr on one device, then
connects to the addr on the other device. But that's not gonna work
either, I think. I still think it will resolve to one device and that
device cannot do loopback...
Steve.
^ permalink raw reply
* Re: [IPV6]: Fix IPsec datagram fragmentation
From: David Miller @ 2008-02-13 2:08 UTC (permalink / raw)
To: herbert; +Cc: yoshfuji, netdev, dlstevens, kazunori
In-Reply-To: <20080213000437.GA19976@gondor.apana.org.au>
From: Herbert Xu <herbert@gondor.apana.org.au>
Date: Wed, 13 Feb 2008 11:04:37 +1100
> [IPV6]: Fix IPsec datagram fragmentation
>
> This is a long-standing bug in the IPsec IPv6 code that breaks
> when we emit a IPsec tunnel-mode datagram packet. The problem
> is that the code the emits the packet assumes the IPv6 stack
> will fragment it later, but the IPv6 stack assumes that whoever
> is emitting the packet is going to pre-fragment the packet.
>
> In the long term we need to fix both sides, e.g., to get the
> datagram code to pre-fragment as well as to get the IPv6 stack
> to fragment locally generated tunnel-mode packet.
>
> For now this patch does the second part which should make it
> work for the IPsec host case.
>
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Applied, and I'll queue this up to -stable as well.
Thanks!
^ permalink raw reply
* Re: [Bug 9750] [patch 2.6.25] dev: avoid a race that triggers assertion failure
From: David Miller @ 2008-02-13 2:16 UTC (permalink / raw)
To: mattilinnanvuori; +Cc: jgarzik, netdev, bugme-daemon
In-Reply-To: <190693.34289.qm@web52005.mail.re2.yahoo.com>
From: Matti Linnanvuori <mattilinnanvuori@yahoo.com>
Date: Tue, 12 Feb 2008 02:45:22 -0800 (PST)
> From: Matti Linnanvuori <mattilinnanvuori@yahoo.com>
>
> There is a race in Linux kernel file net/core/dev.c, function dev_close.
> The function calls function dev_deactivate, which calls function
> dev_watchdog_down that deletes the watchdog timer. However, after that, a
> driver can call netif_carrier_ok, which calls function
> __netdev_watchdog_up that can add the watchdog timer again. Function
> unregister_netdevice calls function dev_shutdown that traps the bug
> !timer_pending(&dev->watchdog_timer). Moving dev_deactivate after
> netif_running() has been cleared prevents function netif_carrier_on
> from calling __netdev_watchdog_up and adding the watchdog timer again.
>
> Signed-off-by: Matti Linnanvuori <mattilinnanvuori@yahoo.com>
Your patch won't apply because it has been whitespace damanged
by your email client.
This is what I let you know last time you posted this patch.
Please fix this up so that your patch can be applied.
Thanks.
^ permalink raw reply
* Re: [PATCH] [IRDA] irda_init() nuke useless debug printk
From: David Miller @ 2008-02-13 2:17 UTC (permalink / raw)
To: max; +Cc: netdev
In-Reply-To: <1202812247-6878-1-git-send-email-max@stro.at>
From: maximilian attems <max@stro.at>
Date: Tue, 12 Feb 2008 11:30:47 +0100
> irda_init()
> dmesg line is not really informative, thus remove it.
> There are better ways to know that a module is loaded.
>
> Seen on a debian config with IRDA_DEBUG enabled.
>
> Signed-off-by: maximilian attems <max@stro.at>
Well if you look at how IRDA_DEBUG is predominantly used,
it's a function tracer, and that's exactly how it's being
used here.
Either we decide that this is OK and leave it there, or
we start moving the whole IRDA tree over to not do this.
Not something in between.
^ permalink raw reply
* Re: [PATCH 2/4] fib_trie: improve output format for /proc/net/fib_trie
From: Andrew Morton @ 2008-02-13 2:28 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: linux-kernel, netdev
In-Reply-To: <20080213005122.727447010@vyatta.com>
On Tue, 12 Feb 2008 16:50:44 -0800 Stephen Hemminger <shemminger@vyatta.com> wrote:
> Make output format prettier (more tree like).
>
> <local>:
> --- 0.0.0.0/0
> |--- 10.111.111.0/24
> | +-- 10.111.111.0/32 link broadcast
> | |--- 10.111.111.254/31
> | | +-- 10.111.111.254/32 host local
> | | +-- 10.111.111.255/32 link broadcast
> |--- 127.0.0.0/8
> | |--- 127.0.0.0/31
> | | +-- 127.0.0.0/32 link broadcast
> | | +-- 127.0.0.0/8 host local
> | | +-- 127.0.0.1/32 host local
> | +-- 127.255.255.255/32 link broadcast
> |--- 192.168.1.0/24
> | |--- 192.168.1.0/28
> | | +-- 192.168.1.0/32 link broadcast
> | | +-- 192.168.1.9/32 host local
> | +-- 192.168.1.255/32 link broadcast
> <main>:
> --- 0.0.0.0/0
> |--- 0.0.0.0/4
> | +-- 0.0.0.0/0 universe unicast
> | +-- 10.111.111.0/24 link unicast
> +-- 169.254.0.0/16 link unicast
> +-- 192.168.1.0/24 link unicast
isn't that a non-back-compatible kernel ABI change? It might
break pre-existing parsers?
aside: how lame are we to put pretty-printers in the kernel?
English-only ones, at that? Root cause: kernel developers still
don't have a sufficiently easy way of shipping userspace tools.
^ permalink raw reply
* [PATCH] [TC U32] Fix input parsing to support more than 9 flow id's correctly
From: PJ Waskiewicz @ 2008-02-12 19:37 UTC (permalink / raw)
To: stephen.hemminger; +Cc: netdev
From: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
Using strtoul with a base of 16 converts flowid 10 into 0x10, which makes
it flowid 16. This is interpreted by the kernel incorrectly, and causes
traffic flows above 9 to be classified into band 0 on multiband qdiscs.
This changes the base to 10, which will correctly parse input into the
proper hexidecimal value.
Signed-off-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
---
tc/tc_util.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/tc/tc_util.c b/tc/tc_util.c
index cdbae42..a277eac 100644
--- a/tc/tc_util.c
+++ b/tc/tc_util.c
@@ -65,7 +65,7 @@ int get_tc_classid(__u32 *h, const char *str)
maj = TC_H_UNSPEC;
if (strcmp(str, "none") == 0)
goto ok;
- maj = strtoul(str, &p, 16);
+ maj = strtoul(str, &p, 10);
if (p == str) {
maj = 0;
if (*p != ':')
@@ -76,7 +76,7 @@ int get_tc_classid(__u32 *h, const char *str)
return -1;
maj <<= 16;
str = p+1;
- min = strtoul(str, &p, 16);
+ min = strtoul(str, &p, 10);
if (*p != 0)
return -1;
if (min >= (1<<16))
^ permalink raw reply related
* Re: [PATCH] e1000e: Fix CRC stripping in hardware context bug
From: Andy Gospodarek @ 2008-02-13 2:33 UTC (permalink / raw)
To: Auke Kok; +Cc: jeff, netdev, johan.andersson, andy, e1000-devel
In-Reply-To: <20080212232024.13842.10804.stgit@localhost.localdomain>
On Tue, Feb 12, 2008 at 03:20:24PM -0800, Auke Kok wrote:
> CRC stripping was only correctly enabled for packet split recieves
> which is used when receiving jumbo frames. Correctly enable SECRC
> also for normal buffer packet receives.
>
> Tested by Andy Gospodarek and Johan Andersson, see bugzilla #9940.
>
This works well on my systems.
Signed-off-by: Andy Gospodarek <andy@greyhouse.net>
^ permalink raw reply
* RE: [PATCH] [TC U32] Fix input parsing to support more than 9 flow id'scorrectly
From: Waskiewicz Jr, Peter P @ 2008-02-13 3:03 UTC (permalink / raw)
To: stephen.hemminger; +Cc: netdev
In-Reply-To: <20080212193725.4137.62287.stgit@localhost.localdomain>
> From: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
>
> Using strtoul with a base of 16 converts flowid 10 into 0x10,
> which makes it flowid 16. This is interpreted by the kernel
> incorrectly, and causes traffic flows above 9 to be
> classified into band 0 on multiband qdiscs.
> This changes the base to 10, which will correctly parse input
> into the proper hexidecimal value.
Stephen,
We can go one of two ways I suppose. Once is this way, since
most user input for CLASSID is base 10, or we can update documentation
to say that CLASSID input is expected to be base 16. What do you think?
Thanks,
-PJ Waskiewicz
peter.p.waskiewicz.jr@intel.com
>
> Signed-off-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
> ---
>
> tc/tc_util.c | 4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/tc/tc_util.c b/tc/tc_util.c index cdbae42..a277eac 100644
> --- a/tc/tc_util.c
> +++ b/tc/tc_util.c
> @@ -65,7 +65,7 @@ int get_tc_classid(__u32 *h, const char *str)
> maj = TC_H_UNSPEC;
> if (strcmp(str, "none") == 0)
> goto ok;
> - maj = strtoul(str, &p, 16);
> + maj = strtoul(str, &p, 10);
> if (p == str) {
> maj = 0;
> if (*p != ':')
> @@ -76,7 +76,7 @@ int get_tc_classid(__u32 *h, const char *str)
> return -1;
> maj <<= 16;
> str = p+1;
> - min = strtoul(str, &p, 16);
> + min = strtoul(str, &p, 10);
> if (*p != 0)
> return -1;
> if (min >= (1<<16))
>
> --
> To unsubscribe from this list: send the line "unsubscribe
> netdev" in the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply
* Re: [PATCH 2/4] fib_trie: improve output format for /proc/net/fib_trie
From: Stephen Hemminger @ 2008-02-13 3:23 UTC (permalink / raw)
To: Andrew Morton; +Cc: Stephen Hemminger, linux-kernel, netdev
In-Reply-To: <20080212182823.6f8a3a12.akpm@linux-foundation.org>
Andrew Morton wrote:
> On Tue, 12 Feb 2008 16:50:44 -0800 Stephen Hemminger <shemminger@vyatta.com> wrote:
>
>
>> Make output format prettier (more tree like).
>>
>> <local>:
>> --- 0.0.0.0/0
>> |--- 10.111.111.0/24
>> | +-- 10.111.111.0/32 link broadcast
>> | |--- 10.111.111.254/31
>> | | +-- 10.111.111.254/32 host local
>> | | +-- 10.111.111.255/32 link broadcast
>> |--- 127.0.0.0/8
>> | |--- 127.0.0.0/31
>> | | +-- 127.0.0.0/32 link broadcast
>> | | +-- 127.0.0.0/8 host local
>> | | +-- 127.0.0.1/32 host local
>> | +-- 127.255.255.255/32 link broadcast
>> |--- 192.168.1.0/24
>> | |--- 192.168.1.0/28
>> | | +-- 192.168.1.0/32 link broadcast
>> | | +-- 192.168.1.9/32 host local
>> | +-- 192.168.1.255/32 link broadcast
>> <main>:
>> --- 0.0.0.0/0
>> |--- 0.0.0.0/4
>> | +-- 0.0.0.0/0 universe unicast
>> | +-- 10.111.111.0/24 link unicast
>> +-- 169.254.0.0/16 link unicast
>> +-- 192.168.1.0/24 link unicast
>>
>
> isn't that a non-back-compatible kernel ABI change? It might
> break pre-existing parsers?
>
>
Fib trie was always experimental and the output format was intended to
be tree like
but was broken. There are no known parsers of fib trie, and I think
Vyatta will probably
be the first distro to ship with it enabled.
> aside: how lame are we to put pretty-printers in the kernel?
> English-only ones, at that? Root cause: kernel developers still
> don't have a sufficiently easy way of shipping userspace tools.
Agreed, the structure of the trie doesn't come out via netlink (only the
addresses).
^ permalink raw reply
* Re: [PATCH] [TC U32] Fix input parsing to support more than 9 flow id'scorrectly
From: Stephen Hemminger @ 2008-02-13 3:26 UTC (permalink / raw)
To: Waskiewicz Jr, Peter P; +Cc: netdev
In-Reply-To: <D5C1322C3E673F459512FB59E0DDC3290482CDB1@orsmsx414.amr.corp.intel.com>
Waskiewicz Jr, Peter P wrote:
>> From: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
>>
>> Using strtoul with a base of 16 converts flowid 10 into 0x10,
>> which makes it flowid 16. This is interpreted by the kernel
>> incorrectly, and causes traffic flows above 9 to be
>> classified into band 0 on multiband qdiscs.
>> This changes the base to 10, which will correctly parse input
>> into the proper hexidecimal value.
>>
>
> Stephen,
> We can go one of two ways I suppose. Once is this way, since
> most user input for CLASSID is base 10, or we can update documentation
> to say that CLASSID input is expected to be base 16. What do you think?
>
> Thanks,
> -PJ Waskiewicz
> peter.p.waskiewicz.jr@intel.com
>
>
Sorry, can't change the api, update the documentation instead.
^ permalink raw reply
* CONTACT THE SECRETARY FOR MORE INFORMATION ON YOUR CLAIMS.
From: David Cincibus @ 2008-02-13 4:07 UTC (permalink / raw)
The Foundation De France would like to notify you on this short note
that you are a grant winner of ($1,000,000)one million us dollars.
CONTACT THE SECRETARY FOR MORE INFORMATION ON YOUR CLAIMS.
Executive Secrtary:Mr.Bernard leroy
Tel:+4470-3196-8499
Email:fdf.secretarybernardleroy_08@yahoo.fr
Regards
^ permalink raw reply
* RE: [PATCH] [TC U32] Fix input parsing to support more than 9 flow id'scorrectly
From: Waskiewicz Jr, Peter P @ 2008-02-13 4:25 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
In-Reply-To: <47B2637C.4070608@vyatta.com>
> Sorry, can't change the api, update the documentation instead.
Yes, this is much more reasonable. I'll send a patch shortly to do
that.
Thanks
-PJ Waskiewicz
^ permalink raw reply
* [PATCH] [IPROUTE2] Update various classifiers' help output for expected CLASSID syntax
From: PJ Waskiewicz @ 2008-02-12 21:51 UTC (permalink / raw)
To: stephen.hemminger; +Cc: netdev
This updates the help output to specify that CLASSID should be hexidecimal.
This makes sure that a user entering "flowid 1:10" gets his flow put into
band 15 (0x10) and knows why.
Signed-off-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
---
doc/actions/actions-general | 3 +++
tc/f_basic.c | 1 +
tc/f_fw.c | 1 +
tc/f_route.c | 1 +
tc/f_rsvp.c | 1 +
tc/f_u32.c | 1 +
6 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/doc/actions/actions-general b/doc/actions/actions-general
index 6561eda..70f7cd6 100644
--- a/doc/actions/actions-general
+++ b/doc/actions/actions-general
@@ -88,6 +88,9 @@ tc filter add dev lo parent ffff: protocol ip prio 8 u32 \
match ip dst 127.0.0.8/32 flowid 1:12 \
action ipt -j mark --set-mark 2
+NOTE: flowid 1:12 is parsed flowid 0x1:0x12. Make sure if you want flowid
+decimal 12, then use flowid 1:c.
+
3) A feature i call pipe
The motivation is derived from Unix pipe mechanism but applied to packets.
Essentially take a matching packet and pass it through
diff --git a/tc/f_basic.c b/tc/f_basic.c
index 19a7edf..d6d7767 100644
--- a/tc/f_basic.c
+++ b/tc/f_basic.c
@@ -32,6 +32,7 @@ static void explain(void)
fprintf(stderr, "\n");
fprintf(stderr, "Where: SELECTOR := SAMPLE SAMPLE ...\n");
fprintf(stderr, " FILTERID := X:Y:Z\n");
+ fprintf(stderr, "\nNOTE: CLASSID is parsed as hexidecimal input.\n");
}
static int basic_parse_opt(struct filter_util *qu, char *handle,
diff --git a/tc/f_fw.c b/tc/f_fw.c
index 6d1490b..9f4ef6e 100644
--- a/tc/f_fw.c
+++ b/tc/f_fw.c
@@ -28,6 +28,7 @@ static void explain(void)
fprintf(stderr, "Usage: ... fw [ classid CLASSID ] [ police POLICE_SPEC ]\n");
fprintf(stderr, " POLICE_SPEC := ... look at TBF\n");
fprintf(stderr, " CLASSID := X:Y\n");
+ fprintf(stderr, "\nNOTE: CLASSID is parsed as hexidecimal input.\n");
}
#define usage() return(-1)
diff --git a/tc/f_route.c b/tc/f_route.c
index a41b9d5..3bb963c 100644
--- a/tc/f_route.c
+++ b/tc/f_route.c
@@ -31,6 +31,7 @@ static void explain(void)
fprintf(stderr, " [ flowid CLASSID ] [ police POLICE_SPEC ]\n");
fprintf(stderr, " POLICE_SPEC := ... look at TBF\n");
fprintf(stderr, " CLASSID := X:Y\n");
+ fprintf(stderr, "\nNOTE: CLASSID is parsed as hexidecimal input.\n");
}
#define usage() return(-1)
diff --git a/tc/f_rsvp.c b/tc/f_rsvp.c
index 13fcf97..9019ee2 100644
--- a/tc/f_rsvp.c
+++ b/tc/f_rsvp.c
@@ -34,6 +34,7 @@ static void explain(void)
fprintf(stderr, " u{8|16|32} NUMBER mask MASK at OFFSET}\n");
fprintf(stderr, " POLICE_SPEC := ... look at TBF\n");
fprintf(stderr, " FILTERID := X:Y\n");
+ fprintf(stderr, "\nNOTE: CLASSID is parsed as hexidecimal input.\n");
}
#define usage() return(-1)
diff --git a/tc/f_u32.c b/tc/f_u32.c
index 91f2838..d38c536 100644
--- a/tc/f_u32.c
+++ b/tc/f_u32.c
@@ -36,6 +36,7 @@ static void explain(void)
fprintf(stderr, "Where: SELECTOR := SAMPLE SAMPLE ...\n");
fprintf(stderr, " SAMPLE := { ip | ip6 | udp | tcp | icmp | u{32|16|8} | mark } SAMPLE_ARGS [divisor DIVISOR]\n");
fprintf(stderr, " FILTERID := X:Y:Z\n");
+ fprintf(stderr, "\nNOTE: CLASSID is parsed at hexidecimal input.\n");
}
#define usage() return(-1)
^ 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