[TIPC]: Force linearization of non-linear sk_buffs
This patch allows TIPC to process incoming messages that are stored in a fragmented sk_buff, by forcing the linearization of any such messages it receives. Note: This is an interim solution to allow TIPC to operate with Ethernet devices that generate non-linear buffers (such as the gianfar driver), until such time as the rest of TIPC is enhanced to handle sk_buffs with multiple data areas. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									bdc82bee43
								
							
						
					
					
						commit
						fe13dda2d2
					
				| @ -337,4 +337,16 @@ static inline void buf_discard(struct sk_buff *skb) | |||||||
| 	kfree_skb(skb); | 	kfree_skb(skb); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * buf_linearize - convert a TIPC message buffer into a single contiguous piece | ||||||
|  |  * @skb: message buffer | ||||||
|  |  * | ||||||
|  |  * Returns 0 on success. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | static inline int buf_linearize(struct sk_buff *skb) | ||||||
|  | { | ||||||
|  | 	return skb_linearize(skb); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -1811,6 +1811,12 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) | |||||||
| #endif | #endif | ||||||
| 			msg_dbg(msg,"<REC<"); | 			msg_dbg(msg,"<REC<"); | ||||||
| 
 | 
 | ||||||
|  | 		/* Ensure message data is a single contiguous unit */ | ||||||
|  | 
 | ||||||
|  | 		if (unlikely(buf_linearize(buf))) { | ||||||
|  | 			goto cont; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if (unlikely(msg_non_seq(msg))) { | 		if (unlikely(msg_non_seq(msg))) { | ||||||
| 			link_recv_non_seq(buf); | 			link_recv_non_seq(buf); | ||||||
| 			continue; | 			continue; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user