diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/bridge/br_netfilter.c | 2 | ||||
| -rw-r--r-- | net/bridge/netfilter/ebt_log.c | 6 | ||||
| -rw-r--r-- | net/core/neighbour.c | 6 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 2 | ||||
| -rw-r--r-- | net/core/wireless.c | 1 | ||||
| -rw-r--r-- | net/ethernet/eth.c | 7 | ||||
| -rw-r--r-- | net/ipv4/fib_trie.c | 56 | ||||
| -rw-r--r-- | net/ipv4/ip_input.c | 6 | ||||
| -rw-r--r-- | net/ipv4/ip_output.c | 8 | ||||
| -rw-r--r-- | net/ipv4/ipconfig.c | 4 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 10 | ||||
| -rw-r--r-- | net/ipv4/ipvs/ip_vs_conn.c | 25 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_CLUSTERIP.c | 7 | ||||
| -rw-r--r-- | net/ipv4/route.c | 9 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 19 | ||||
| -rw-r--r-- | net/ipv6/ip6_flowlabel.c | 1 | ||||
| -rw-r--r-- | net/sched/act_api.c | 10 | ||||
| -rw-r--r-- | net/sched/cls_api.c | 2 | ||||
| -rw-r--r-- | net/sched/cls_rsvp.h | 1 | ||||
| -rw-r--r-- | net/sched/sch_api.c | 2 | ||||
| -rw-r--r-- | net/sched/sch_cbq.c | 3 | ||||
| -rw-r--r-- | net/sctp/endpointola.c | 13 | ||||
| -rw-r--r-- | net/sctp/protocol.c | 5 | ||||
| -rw-r--r-- | net/sctp/sysctl.c | 13 | ||||
| -rw-r--r-- | net/sctp/transport.c | 1 | 
25 files changed, 136 insertions, 83 deletions
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 03ae4edddac3..2d52fee63a8c 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c @@ -844,7 +844,7 @@ static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb,  		 * doesn't use the bridge parent of the indev by using  		 * the BRNF_DONT_TAKE_PARENT mask. */  		if (hook == NF_IP_FORWARD && nf_bridge->physindev == NULL) { -			nf_bridge->mask &= BRNF_DONT_TAKE_PARENT; +			nf_bridge->mask |= BRNF_DONT_TAKE_PARENT;  			nf_bridge->physindev = (struct net_device *)in;  		}  #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) diff --git a/net/bridge/netfilter/ebt_log.c b/net/bridge/netfilter/ebt_log.c index e4ae34b88925..662975be3d1d 100644 --- a/net/bridge/netfilter/ebt_log.c +++ b/net/bridge/netfilter/ebt_log.c @@ -61,8 +61,6 @@ static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,  {  	struct ebt_log_info *info = (struct ebt_log_info *)data;  	char level_string[4] = "< >"; -	union {struct iphdr iph; struct tcpudphdr ports; -	       struct arphdr arph; struct arppayload arpp;} u;  	level_string[1] = '0' + info->loglevel;  	spin_lock_bh(&ebt_log_lock); @@ -88,7 +86,7 @@ static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,  		}  		printk(" IP SRC=%u.%u.%u.%u IP DST=%u.%u.%u.%u,",  		   NIPQUAD(ih->saddr), NIPQUAD(ih->daddr)); -		printk(" IP tos=0x%02X, IP proto=%d", u.iph.tos, +		printk(" IP tos=0x%02X, IP proto=%d", ih->tos,  		       ih->protocol);  		if (ih->protocol == IPPROTO_TCP ||  		    ih->protocol == IPPROTO_UDP) { @@ -127,7 +125,7 @@ static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,  		    ah->ar_pln == sizeof(uint32_t)) {  			struct arppayload _arpp, *ap; -			ap = skb_header_pointer(skb, sizeof(u.arph), +			ap = skb_header_pointer(skb, sizeof(_arph),  						sizeof(_arpp), &_arpp);  			if (ap == NULL) {  				printk(" INCOMPLETE ARP payload"); diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 851eb927ed97..1beb782ac41b 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -1598,6 +1598,8 @@ static int neightbl_fill_info(struct neigh_table *tbl, struct sk_buff *skb,  	read_lock_bh(&tbl->lock);  	ndtmsg->ndtm_family = tbl->family; +	ndtmsg->ndtm_pad1   = 0; +	ndtmsg->ndtm_pad2   = 0;  	RTA_PUT_STRING(skb, NDTA_NAME, tbl->id);  	RTA_PUT_MSECS(skb, NDTA_GC_INTERVAL, tbl->gc_interval); @@ -1683,6 +1685,8 @@ static int neightbl_fill_param_info(struct neigh_table *tbl,  	read_lock_bh(&tbl->lock);  	ndtmsg->ndtm_family = tbl->family; +	ndtmsg->ndtm_pad1   = 0; +	ndtmsg->ndtm_pad2   = 0;  	RTA_PUT_STRING(skb, NDTA_NAME, tbl->id);  	if (neightbl_fill_parms(skb, parms) < 0) @@ -1872,6 +1876,8 @@ static int neigh_fill_info(struct sk_buff *skb, struct neighbour *n,  	struct ndmsg *ndm = NLMSG_DATA(nlh);  	ndm->ndm_family	 = n->ops->family; +	ndm->ndm_pad1    = 0; +	ndm->ndm_pad2    = 0;  	ndm->ndm_flags	 = n->flags;  	ndm->ndm_type	 = n->type;  	ndm->ndm_ifindex = n->dev->ifindex; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index e013d836a7ab..4b1bb30e6381 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -126,6 +126,7 @@ void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data  	rta->rta_type = attrtype;  	rta->rta_len = size;  	memcpy(RTA_DATA(rta), data, attrlen); +	memset(RTA_DATA(rta) + attrlen, 0, RTA_ALIGN(size) - size);  }  size_t rtattr_strlcpy(char *dest, const struct rtattr *rta, size_t size) @@ -188,6 +189,7 @@ static int rtnetlink_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,  	nlh = NLMSG_NEW(skb, pid, seq, type, sizeof(*r), flags);  	r = NLMSG_DATA(nlh);  	r->ifi_family = AF_UNSPEC; +	r->__ifi_pad = 0;  	r->ifi_type = dev->type;  	r->ifi_index = dev->ifindex;  	r->ifi_flags = dev_get_flags(dev); diff --git a/net/core/wireless.c b/net/core/wireless.c index b2fe378dfbf8..3ff5639c0b78 100644 --- a/net/core/wireless.c +++ b/net/core/wireless.c @@ -1102,6 +1102,7 @@ static inline int rtnetlink_fill_iwinfo(struct sk_buff *	skb,  	nlh = NLMSG_PUT(skb, 0, 0, type, sizeof(*r));  	r = NLMSG_DATA(nlh);  	r->ifi_family = AF_UNSPEC; +	r->__ifi_pad = 0;  	r->ifi_type = dev->type;  	r->ifi_index = dev->ifindex;  	r->ifi_flags = dev->flags; diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index 6617ea47d365..ab60ea63688e 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c @@ -92,10 +92,9 @@ int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,  	 *	Set the source hardware address.   	 */ -	if(saddr) -		memcpy(eth->h_source,saddr,dev->addr_len); -	else -		memcpy(eth->h_source,dev->dev_addr,dev->addr_len); +	if(!saddr) +		saddr = dev->dev_addr; +	memcpy(eth->h_source,saddr,dev->addr_len);  	/*  	 *	Anyway, the loopback-device should never use this function...  diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 0671569ee6f0..b56e88edf1b3 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -43,7 +43,7 @@   *		2 of the License, or (at your option) any later version.   */ -#define VERSION "0.323" +#define VERSION "0.324"  #include <linux/config.h>  #include <asm/uaccess.h> @@ -341,8 +341,10 @@ static struct leaf *leaf_new(void)  static struct leaf_info *leaf_info_new(int plen)  {  	struct leaf_info *li = kmalloc(sizeof(struct leaf_info),  GFP_KERNEL); -	li->plen = plen; -	INIT_LIST_HEAD(&li->falh); +	if(li) { +		li->plen = plen; +		INIT_LIST_HEAD(&li->falh); +	}  	return li;  } @@ -879,8 +881,8 @@ static struct node *trie_rebalance(struct trie *t, struct tnode *tn)  	return (struct node*) tn;  } -static struct list_head * -fib_insert_node(struct trie *t, u32 key, int plen) +static  struct list_head * +fib_insert_node(struct trie *t, int *err, u32 key, int plen)  {  	int pos, newpos;  	struct tnode *tp = NULL, *tn = NULL; @@ -940,7 +942,6 @@ fib_insert_node(struct trie *t, u32 key, int plen)  	if(tp && IS_LEAF(tp))  		BUG(); -	t->revision++;  	/* Case 1: n is a leaf. Compare prefixes */ @@ -949,8 +950,10 @@ fib_insert_node(struct trie *t, u32 key, int plen)  		li = leaf_info_new(plen); -		if(! li)  -			BUG(); +		if(! li) { +			*err = -ENOMEM; +			goto err; +		}  		fa_head = &li->falh;  		insert_leaf_info(&l->list, li); @@ -959,14 +962,19 @@ fib_insert_node(struct trie *t, u32 key, int plen)  	t->size++;  	l = leaf_new(); -	if(! l)  -		BUG(); +	if(! l) { +		*err = -ENOMEM; +		goto err; +	}  	l->key = key;  	li = leaf_info_new(plen); -	if(! li)  -		BUG(); +	if(! li) { +		tnode_free((struct tnode *) l); +		*err = -ENOMEM; +		goto err; +	}  	fa_head = &li->falh;  	insert_leaf_info(&l->list, li); @@ -1003,9 +1011,14 @@ fib_insert_node(struct trie *t, u32 key, int plen)  			newpos = 0;  			tn = tnode_new(key, newpos, 1); /* First tnode */   		} -		if(!tn)  -			trie_bug("tnode_pfx_new failed"); +		if(!tn) { +			free_leaf_info(li); +			tnode_free((struct tnode *) l); +			*err = -ENOMEM; +			goto err; +		}			 +			  		NODE_SET_PARENT(tn, tp);  		missbit=tkey_extract_bits(key, newpos, 1); @@ -1027,7 +1040,9 @@ fib_insert_node(struct trie *t, u32 key, int plen)  	}  	/* Rebalance the trie */  	t->trie = trie_rebalance(t, tp); -done:; +done: +	t->revision++; +err:;  	return fa_head;  } @@ -1156,8 +1171,12 @@ fn_trie_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta,  	 * Insert new entry to the list.  	 */ -	if(!fa_head) -		fa_head = fib_insert_node(t, key, plen); +	if(!fa_head) { +		fa_head = fib_insert_node(t, &err, key, plen); +		err = 0; +		if(err)  +			goto out_free_new_fa; +	}  	write_lock_bh(&fib_lock); @@ -1170,6 +1189,9 @@ fn_trie_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta,  	rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, nlhdr, req);  succeeded:  	return 0; + +out_free_new_fa: +	kmem_cache_free(fn_alias_kmem, new_fa);  out:  	fib_release_info(fi);  err:;	 diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index af2ec88bbb2f..c703528e0bcd 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c @@ -283,14 +283,18 @@ static inline int ip_rcv_finish(struct sk_buff *skb)  {  	struct net_device *dev = skb->dev;  	struct iphdr *iph = skb->nh.iph; +	int err;  	/*  	 *	Initialise the virtual path cache for the packet. It describes  	 *	how the packet travels inside Linux networking.  	 */   	if (skb->dst == NULL) { -		if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev)) +		if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) { +			if (err == -EHOSTUNREACH) +				IP_INC_STATS_BH(IPSTATS_MIB_INADDRERRORS);  			goto drop;  +		}  	}  #ifdef CONFIG_NET_CLS_ROUTE diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index ee07aec215a0..6ce5c3292f9f 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -188,7 +188,13 @@ static inline int ip_finish_output2(struct sk_buff *skb)  		skb = skb2;  	} -	nf_reset(skb); +#ifdef CONFIG_BRIDGE_NETFILTER +	/* bridge-netfilter defers calling some IP hooks to the bridge layer +	 * and still needs the conntrack reference. +	 */ +	if (skb->nf_bridge == NULL) +#endif +		nf_reset(skb);  	if (hh) {  		int hh_alen; diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index f2509034ce72..d2bf8e1930a3 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c @@ -1149,8 +1149,10 @@ static int __init ic_dynamic(void)  		ic_rarp_cleanup();  #endif -	if (!ic_got_reply) +	if (!ic_got_reply) { +		ic_myaddr = INADDR_NONE;  		return -1; +	}  	printk("IP-Config: Got %s answer from %u.%u.%u.%u, ",  		((ic_got_reply & IC_RARP) ? "RARP"  diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index e4f809a93f47..7833d920bdba 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -297,6 +297,7 @@ static int vif_delete(int vifi)  static void ipmr_destroy_unres(struct mfc_cache *c)  {  	struct sk_buff *skb; +	struct nlmsgerr *e;  	atomic_dec(&cache_resolve_queue_len); @@ -306,7 +307,9 @@ static void ipmr_destroy_unres(struct mfc_cache *c)  			nlh->nlmsg_type = NLMSG_ERROR;  			nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr));  			skb_trim(skb, nlh->nlmsg_len); -			((struct nlmsgerr*)NLMSG_DATA(nlh))->error = -ETIMEDOUT; +			e = NLMSG_DATA(nlh); +			e->error = -ETIMEDOUT; +			memset(&e->msg, 0, sizeof(e->msg));  			netlink_unicast(rtnl, skb, NETLINK_CB(skb).dst_pid, MSG_DONTWAIT);  		} else  			kfree_skb(skb); @@ -499,6 +502,7 @@ static struct mfc_cache *ipmr_cache_alloc_unres(void)  static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c)  {  	struct sk_buff *skb; +	struct nlmsgerr *e;  	/*  	 *	Play the pending entries through our router @@ -515,7 +519,9 @@ static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c)  				nlh->nlmsg_type = NLMSG_ERROR;  				nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr));  				skb_trim(skb, nlh->nlmsg_len); -				((struct nlmsgerr*)NLMSG_DATA(nlh))->error = -EMSGSIZE; +				e = NLMSG_DATA(nlh); +				e->error = -EMSGSIZE; +				memset(&e->msg, 0, sizeof(e->msg));  			}  			err = netlink_unicast(rtnl, skb, NETLINK_CB(skb).dst_pid, MSG_DONTWAIT);  		} else diff --git a/net/ipv4/ipvs/ip_vs_conn.c b/net/ipv4/ipvs/ip_vs_conn.c index fd6feb5499fe..9f16ab309106 100644 --- a/net/ipv4/ipvs/ip_vs_conn.c +++ b/net/ipv4/ipvs/ip_vs_conn.c @@ -548,7 +548,6 @@ void ip_vs_conn_expire_now(struct ip_vs_conn *cp)  {  	if (del_timer(&cp->timer))  		mod_timer(&cp->timer, jiffies); -	__ip_vs_conn_put(cp);  } @@ -764,7 +763,6 @@ void ip_vs_random_dropentry(void)  {  	int idx;  	struct ip_vs_conn *cp; -	struct ip_vs_conn *ct;  	/*  	 * Randomly scan 1/32 of the whole table every second @@ -801,21 +799,12 @@ void ip_vs_random_dropentry(void)  					continue;  			} -			/* -			 * Drop the entry, and drop its ct if not referenced -			 */ -			atomic_inc(&cp->refcnt); -			ct_write_unlock(hash); - -			if ((ct = cp->control)) -				atomic_inc(&ct->refcnt);  			IP_VS_DBG(4, "del connection\n");  			ip_vs_conn_expire_now(cp); -			if (ct) { +			if (cp->control) {  				IP_VS_DBG(4, "del conn template\n"); -				ip_vs_conn_expire_now(ct); +				ip_vs_conn_expire_now(cp->control);  			} -			ct_write_lock(hash);  		}  		ct_write_unlock(hash);  	} @@ -829,7 +818,6 @@ static void ip_vs_conn_flush(void)  {  	int idx;  	struct ip_vs_conn *cp; -	struct ip_vs_conn *ct;    flush_again:  	for (idx=0; idx<IP_VS_CONN_TAB_SIZE; idx++) { @@ -839,18 +827,13 @@ static void ip_vs_conn_flush(void)  		ct_write_lock_bh(idx);  		list_for_each_entry(cp, &ip_vs_conn_tab[idx], c_list) { -			atomic_inc(&cp->refcnt); -			ct_write_unlock(idx); -			if ((ct = cp->control)) -				atomic_inc(&ct->refcnt);  			IP_VS_DBG(4, "del connection\n");  			ip_vs_conn_expire_now(cp); -			if (ct) { +			if (cp->control) {  				IP_VS_DBG(4, "del conn template\n"); -				ip_vs_conn_expire_now(ct); +				ip_vs_conn_expire_now(cp->control);  			} -			ct_write_lock(idx);  		}  		ct_write_unlock_bh(idx);  	} diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c index 9cde8c61f525..6706d3a1bc4f 100644 --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c @@ -30,7 +30,7 @@  #include <linux/netfilter_ipv4/ipt_CLUSTERIP.h>  #include <linux/netfilter_ipv4/ip_conntrack.h> -#define CLUSTERIP_VERSION "0.6" +#define CLUSTERIP_VERSION "0.7"  #define DEBUG_CLUSTERIP @@ -524,8 +524,9 @@ arp_mangle(unsigned int hook,  	    || arp->ar_pln != 4 || arp->ar_hln != ETH_ALEN)  		return NF_ACCEPT; -	/* we only want to mangle arp replies */ -	if (arp->ar_op != htons(ARPOP_REPLY)) +	/* we only want to mangle arp requests and replies */ +	if (arp->ar_op != htons(ARPOP_REPLY) +	    && arp->ar_op != htons(ARPOP_REQUEST))  		return NF_ACCEPT;  	payload = (void *)(arp+1); diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 80cf633d9f4a..12a1cf306f67 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -1909,7 +1909,7 @@ static int ip_route_input_slow(struct sk_buff *skb, u32 daddr, u32 saddr,  	 */  	if ((err = fib_lookup(&fl, &res)) != 0) {  		if (!IN_DEV_FORWARD(in_dev)) -			goto e_inval; +			goto e_hostunreach;  		goto no_route;  	}  	free_res = 1; @@ -1933,7 +1933,7 @@ static int ip_route_input_slow(struct sk_buff *skb, u32 daddr, u32 saddr,  	}  	if (!IN_DEV_FORWARD(in_dev)) -		goto e_inval; +		goto e_hostunreach;  	if (res.type != RTN_UNICAST)  		goto martian_destination; @@ -2025,6 +2025,11 @@ martian_destination:  			"%u.%u.%u.%u, dev %s\n",  			NIPQUAD(daddr), NIPQUAD(saddr), dev->name);  #endif + +e_hostunreach: +        err = -EHOSTUNREACH; +        goto done; +  e_inval:  	err = -EINVAL;  	goto done; diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a54d4ef3fd35..77004b9456c0 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -2777,7 +2777,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,  		read_lock_bh(&idev->lock);  		switch (type) {  		case UNICAST_ADDR: -			/* unicast address */ +			/* unicast address incl. temp addr */  			for (ifa = idev->addr_list; ifa;  			     ifa = ifa->if_next, ip_idx++) {  				if (ip_idx < s_ip_idx) @@ -2788,19 +2788,6 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,  				    NLM_F_MULTI)) <= 0)  					goto done;  			} -			/* temp addr */ -#ifdef CONFIG_IPV6_PRIVACY -			for (ifa = idev->tempaddr_list; ifa;  -			     ifa = ifa->tmp_next, ip_idx++) { -				if (ip_idx < s_ip_idx) -					continue; -				if ((err = inet6_fill_ifaddr(skb, ifa,  -				    NETLINK_CB(cb->skb).pid,  -				    cb->nlh->nlmsg_seq, RTM_NEWADDR, -				    NLM_F_MULTI)) <= 0)  -					goto done; -			} -#endif  			break;  		case MULTICAST_ADDR:  			/* multicast address */ @@ -2923,6 +2910,7 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,  	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*r), flags);  	r = NLMSG_DATA(nlh);  	r->ifi_family = AF_INET6; +	r->__ifi_pad = 0;  	r->ifi_type = dev->type;  	r->ifi_index = dev->ifindex;  	r->ifi_flags = dev_get_flags(dev); @@ -3030,9 +3018,12 @@ static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,  	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*pmsg), flags);  	pmsg = NLMSG_DATA(nlh);  	pmsg->prefix_family = AF_INET6; +	pmsg->prefix_pad1 = 0; +	pmsg->prefix_pad2 = 0;  	pmsg->prefix_ifindex = idev->dev->ifindex;  	pmsg->prefix_len = pinfo->prefix_len;  	pmsg->prefix_type = pinfo->type; +	pmsg->prefix_pad3 = 0;  	pmsg->prefix_flags = 0;  	if (pinfo->onlink) diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index 0e5f7499debb..b6c73da5ff35 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c @@ -244,7 +244,6 @@ struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space,  		opt_space->opt_nflen = 0;  	}  	opt_space->dst1opt = fopt->dst1opt; -	opt_space->auth = fopt->auth;  	opt_space->opt_flen = fopt->opt_flen;  	return opt_space;  } diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 9594206e6035..249c61936ea0 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c @@ -439,6 +439,8 @@ tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq,  	t = NLMSG_DATA(nlh);  	t->tca_family = AF_UNSPEC; +	t->tca__pad1 = 0; +	t->tca__pad2 = 0;  	x = (struct rtattr*) skb->tail;  	RTA_PUT(skb, TCA_ACT_TAB, 0, NULL); @@ -580,6 +582,8 @@ static int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid)  	nlh = NLMSG_PUT(skb, pid, n->nlmsg_seq, RTM_DELACTION, sizeof(*t));  	t = NLMSG_DATA(nlh);  	t->tca_family = AF_UNSPEC; +	t->tca__pad1 = 0; +	t->tca__pad2 = 0;  	x = (struct rtattr *) skb->tail;  	RTA_PUT(skb, TCA_ACT_TAB, 0, NULL); @@ -687,7 +691,9 @@ static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event,  	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*t), flags);  	t = NLMSG_DATA(nlh);  	t->tca_family = AF_UNSPEC; -	 +	t->tca__pad1 = 0; +	t->tca__pad2 = 0; +  	x = (struct rtattr*) skb->tail;  	RTA_PUT(skb, TCA_ACT_TAB, 0, NULL); @@ -842,6 +848,8 @@ tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)  	                cb->nlh->nlmsg_type, sizeof(*t));  	t = NLMSG_DATA(nlh);  	t->tca_family = AF_UNSPEC; +	t->tca__pad1 = 0; +	t->tca__pad2 = 0;  	x = (struct rtattr *) skb->tail;  	RTA_PUT(skb, TCA_ACT_TAB, 0, NULL); diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 1616bf5c9627..3b5714ef4d1a 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c @@ -331,6 +331,8 @@ tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp, unsigned long fh,  	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);  	tcm = NLMSG_DATA(nlh);  	tcm->tcm_family = AF_UNSPEC; +	tcm->tcm__pad1 = 0; +	tcm->tcm__pad1 = 0;  	tcm->tcm_ifindex = tp->q->dev->ifindex;  	tcm->tcm_parent = tp->classid;  	tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h index 232fb9196810..006168d69376 100644 --- a/net/sched/cls_rsvp.h +++ b/net/sched/cls_rsvp.h @@ -618,6 +618,7 @@ static int rsvp_dump(struct tcf_proto *tp, unsigned long fh,  	pinfo.protocol = s->protocol;  	pinfo.tunnelid = s->tunnelid;  	pinfo.tunnelhdr = f->tunnelhdr; +	pinfo.pad = 0;  	RTA_PUT(skb, TCA_RSVP_PINFO, sizeof(pinfo), &pinfo);  	if (f->res.classid)  		RTA_PUT(skb, TCA_RSVP_CLASSID, 4, &f->res.classid); diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 97c1c75d5c78..05e6e0a799da 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -770,6 +770,8 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid,  	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);  	tcm = NLMSG_DATA(nlh);  	tcm->tcm_family = AF_UNSPEC; +	tcm->tcm__pad1 = 0; +	tcm->tcm__pad2 = 0;  	tcm->tcm_ifindex = q->dev->ifindex;  	tcm->tcm_parent = clid;  	tcm->tcm_handle = q->handle; diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index d43e3b8cbf6a..09453f997d8c 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c @@ -1528,6 +1528,7 @@ static __inline__ int cbq_dump_ovl(struct sk_buff *skb, struct cbq_class *cl)  	opt.strategy = cl->ovl_strategy;  	opt.priority2 = cl->priority2+1; +	opt.pad = 0;  	opt.penalty = (cl->penalty*1000)/HZ;  	RTA_PUT(skb, TCA_CBQ_OVL_STRATEGY, sizeof(opt), &opt);  	return skb->len; @@ -1563,6 +1564,8 @@ static __inline__ int cbq_dump_police(struct sk_buff *skb, struct cbq_class *cl)  	if (cl->police) {  		opt.police = cl->police; +		opt.__res1 = 0; +		opt.__res2 = 0;  		RTA_PUT(skb, TCA_CBQ_POLICE, sizeof(opt), &opt);  	}  	return skb->len; diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index 2ec0320fac3b..c44bf4165c6e 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c @@ -102,9 +102,9 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,  	/* Set up the base timeout information.  */  	ep->timeouts[SCTP_EVENT_TIMEOUT_NONE] = 0;  	ep->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] = -		SCTP_DEFAULT_TIMEOUT_T1_COOKIE; +		msecs_to_jiffies(sp->rtoinfo.srto_initial);  	ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = -		SCTP_DEFAULT_TIMEOUT_T1_INIT; +		msecs_to_jiffies(sp->rtoinfo.srto_initial);  	ep->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] =  		msecs_to_jiffies(sp->rtoinfo.srto_initial);  	ep->timeouts[SCTP_EVENT_TIMEOUT_T3_RTX] = 0; @@ -117,12 +117,9 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,          ep->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]  		= 5 * msecs_to_jiffies(sp->rtoinfo.srto_max); -	ep->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = -		SCTP_DEFAULT_TIMEOUT_HEARTBEAT; -	ep->timeouts[SCTP_EVENT_TIMEOUT_SACK] = -		SCTP_DEFAULT_TIMEOUT_SACK; -	ep->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = -		sp->autoclose * HZ; +	ep->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0; +	ep->timeouts[SCTP_EVENT_TIMEOUT_SACK] = sctp_sack_timeout; +	ep->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = sp->autoclose * HZ;  	/* Use SCTP specific send buffer space queues.  */  	ep->sndbuf_policy = sctp_sndbuf_policy; diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 5135e1a25d25..e7f37faba7c0 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -1050,7 +1050,10 @@ SCTP_STATIC __init int sctp_init(void)  	sctp_sndbuf_policy		= 0;  	/* HB.interval              - 30 seconds */ -	sctp_hb_interval		= 30 * HZ; +	sctp_hb_interval		= SCTP_DEFAULT_TIMEOUT_HEARTBEAT; + +	/* delayed SACK timeout */ +	sctp_sack_timeout		= SCTP_DEFAULT_TIMEOUT_SACK;  	/* Implementation specific variables. */ diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 7fc31849312b..dc4893474f18 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c @@ -47,6 +47,8 @@  static ctl_handler sctp_sysctl_jiffies_ms;  static long rto_timer_min = 1;  static long rto_timer_max = 86400000; /* One day */ +static long sack_timer_min = 1; +static long sack_timer_max = 500;  static ctl_table sctp_table[] = {  	{ @@ -187,6 +189,17 @@ static ctl_table sctp_table[] = {  		.mode		= 0644,  		.proc_handler	= &proc_dointvec  	}, +	{ +		.ctl_name	= NET_SCTP_SACK_TIMEOUT, +		.procname	= "sack_timeout", +		.data		= &sctp_sack_timeout, +		.maxlen		= sizeof(long), +		.mode		= 0644, +		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax, +		.strategy	= &sctp_sysctl_jiffies_ms, +		.extra1         = &sack_timer_min, +		.extra2         = &sack_timer_max, +	},  	{ .ctl_name = 0 }  }; diff --git a/net/sctp/transport.c b/net/sctp/transport.c index 0ec0fde6e6c5..a63b69179607 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c @@ -103,7 +103,6 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer,  	/* Set up the heartbeat timer. */  	init_timer(&peer->hb_timer); -	peer->hb_interval = SCTP_DEFAULT_TIMEOUT_HEARTBEAT;  	peer->hb_timer.function = sctp_generate_heartbeat_event;  	peer->hb_timer.data = (unsigned long)peer;  | 
