Kaynağa Gözat

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
  netfilter: ctnetlink: fix timeout calculation
  ipvs: try also real server with port 0 in backup server
  skge: restore rx multicast filter on resume and after config changes
  mlx4_en: nullify cq->vector field when closing completion queue
Linus Torvalds 13 yıl önce
ebeveyn
işleme
733bbb7e1c

+ 3 - 0
drivers/net/ethernet/marvell/skge.c

@@ -2606,6 +2606,9 @@ static int skge_up(struct net_device *dev)
 	spin_unlock_irq(&hw->hw_lock);
 	spin_unlock_irq(&hw->hw_lock);
 
 
 	napi_enable(&skge->napi);
 	napi_enable(&skge->napi);
+
+	skge_set_multicast(dev);
+
 	return 0;
 	return 0;
 
 
  free_tx_ring:
  free_tx_ring:

+ 1 - 0
drivers/net/ethernet/mellanox/mlx4/en_cq.c

@@ -147,6 +147,7 @@ void mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq)
 	mlx4_free_hwq_res(mdev->dev, &cq->wqres, cq->buf_size);
 	mlx4_free_hwq_res(mdev->dev, &cq->wqres, cq->buf_size);
 	if (priv->mdev->dev->caps.comp_pool && cq->vector)
 	if (priv->mdev->dev->caps.comp_pool && cq->vector)
 		mlx4_release_eq(priv->mdev->dev, cq->vector);
 		mlx4_release_eq(priv->mdev->dev, cq->vector);
+	cq->vector = 0;
 	cq->buf_size = 0;
 	cq->buf_size = 0;
 	cq->buf = NULL;
 	cq->buf = NULL;
 }
 }

+ 1 - 1
include/net/ip_vs.h

@@ -1207,7 +1207,7 @@ extern void ip_vs_control_cleanup(void);
 extern struct ip_vs_dest *
 extern struct ip_vs_dest *
 ip_vs_find_dest(struct net *net, int af, const union nf_inet_addr *daddr,
 ip_vs_find_dest(struct net *net, int af, const union nf_inet_addr *daddr,
 		__be16 dport, const union nf_inet_addr *vaddr, __be16 vport,
 		__be16 dport, const union nf_inet_addr *vaddr, __be16 vport,
-		__u16 protocol, __u32 fwmark);
+		__u16 protocol, __u32 fwmark, __u32 flags);
 extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp);
 extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp);
 
 
 
 

+ 1 - 1
net/netfilter/ipvs/ip_vs_conn.c

@@ -616,7 +616,7 @@ struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp)
 	if ((cp) && (!cp->dest)) {
 	if ((cp) && (!cp->dest)) {
 		dest = ip_vs_find_dest(ip_vs_conn_net(cp), cp->af, &cp->daddr,
 		dest = ip_vs_find_dest(ip_vs_conn_net(cp), cp->af, &cp->daddr,
 				       cp->dport, &cp->vaddr, cp->vport,
 				       cp->dport, &cp->vaddr, cp->vport,
-				       cp->protocol, cp->fwmark);
+				       cp->protocol, cp->fwmark, cp->flags);
 		ip_vs_bind_dest(cp, dest);
 		ip_vs_bind_dest(cp, dest);
 		return dest;
 		return dest;
 	} else
 	} else

+ 8 - 2
net/netfilter/ipvs/ip_vs_ctl.c

@@ -619,15 +619,21 @@ struct ip_vs_dest *ip_vs_find_dest(struct net  *net, int af,
 				   const union nf_inet_addr *daddr,
 				   const union nf_inet_addr *daddr,
 				   __be16 dport,
 				   __be16 dport,
 				   const union nf_inet_addr *vaddr,
 				   const union nf_inet_addr *vaddr,
-				   __be16 vport, __u16 protocol, __u32 fwmark)
+				   __be16 vport, __u16 protocol, __u32 fwmark,
+				   __u32 flags)
 {
 {
 	struct ip_vs_dest *dest;
 	struct ip_vs_dest *dest;
 	struct ip_vs_service *svc;
 	struct ip_vs_service *svc;
+	__be16 port = dport;
 
 
 	svc = ip_vs_service_get(net, af, fwmark, protocol, vaddr, vport);
 	svc = ip_vs_service_get(net, af, fwmark, protocol, vaddr, vport);
 	if (!svc)
 	if (!svc)
 		return NULL;
 		return NULL;
-	dest = ip_vs_lookup_dest(svc, daddr, dport);
+	if (fwmark && (flags & IP_VS_CONN_F_FWD_MASK) != IP_VS_CONN_F_MASQ)
+		port = 0;
+	dest = ip_vs_lookup_dest(svc, daddr, port);
+	if (!dest)
+		dest = ip_vs_lookup_dest(svc, daddr, port ^ dport);
 	if (dest)
 	if (dest)
 		atomic_inc(&dest->refcnt);
 		atomic_inc(&dest->refcnt);
 	ip_vs_service_put(svc);
 	ip_vs_service_put(svc);

+ 1 - 1
net/netfilter/ipvs/ip_vs_sync.c

@@ -740,7 +740,7 @@ static void ip_vs_proc_conn(struct net *net, struct ip_vs_conn_param *param,
 		 * but still handled.
 		 * but still handled.
 		 */
 		 */
 		dest = ip_vs_find_dest(net, type, daddr, dport, param->vaddr,
 		dest = ip_vs_find_dest(net, type, daddr, dport, param->vaddr,
-				       param->vport, protocol, fwmark);
+				       param->vport, protocol, fwmark, flags);
 
 
 		/*  Set the approprite ativity flag */
 		/*  Set the approprite ativity flag */
 		if (protocol == IPPROTO_TCP) {
 		if (protocol == IPPROTO_TCP) {

+ 2 - 2
net/netfilter/nf_conntrack_netlink.c

@@ -135,7 +135,7 @@ nla_put_failure:
 static inline int
 static inline int
 ctnetlink_dump_timeout(struct sk_buff *skb, const struct nf_conn *ct)
 ctnetlink_dump_timeout(struct sk_buff *skb, const struct nf_conn *ct)
 {
 {
-	long timeout = (ct->timeout.expires - jiffies) / HZ;
+	long timeout = ((long)ct->timeout.expires - (long)jiffies) / HZ;
 
 
 	if (timeout < 0)
 	if (timeout < 0)
 		timeout = 0;
 		timeout = 0;
@@ -1641,7 +1641,7 @@ ctnetlink_exp_dump_expect(struct sk_buff *skb,
 			  const struct nf_conntrack_expect *exp)
 			  const struct nf_conntrack_expect *exp)
 {
 {
 	struct nf_conn *master = exp->master;
 	struct nf_conn *master = exp->master;
-	long timeout = (exp->timeout.expires - jiffies) / HZ;
+	long timeout = ((long)exp->timeout.expires - (long)jiffies) / HZ;
 	struct nf_conn_help *help;
 	struct nf_conn_help *help;
 
 
 	if (timeout < 0)
 	if (timeout < 0)