forked from mirrors/linux
		
	sk_buff: allow segmenting based on frag sizes
This patch allows segmenting a skb based on its frags sizes instead of based on a fixed value. Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Tested-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									57c0565039
								
							
						
					
					
						commit
						3953c46c3a
					
				
					 2 changed files with 12 additions and 3 deletions
				
			
		| 
						 | 
					@ -301,6 +301,11 @@ struct sk_buff;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
extern int sysctl_max_skb_frags;
 | 
					extern int sysctl_max_skb_frags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set skb_shinfo(skb)->gso_size to this in case you want skb_segment to
 | 
				
			||||||
 | 
					 * segment using its current segmentation instead.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define GSO_BY_FRAGS	0xFFFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct skb_frag_struct skb_frag_t;
 | 
					typedef struct skb_frag_struct skb_frag_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct skb_frag_struct {
 | 
					struct skb_frag_struct {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3116,9 +3116,13 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
 | 
				
			||||||
		int hsize;
 | 
							int hsize;
 | 
				
			||||||
		int size;
 | 
							int size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (unlikely(mss == GSO_BY_FRAGS)) {
 | 
				
			||||||
 | 
								len = list_skb->len;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			len = head_skb->len - offset;
 | 
								len = head_skb->len - offset;
 | 
				
			||||||
			if (len > mss)
 | 
								if (len > mss)
 | 
				
			||||||
				len = mss;
 | 
									len = mss;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		hsize = skb_headlen(head_skb) - offset;
 | 
							hsize = skb_headlen(head_skb) - offset;
 | 
				
			||||||
		if (hsize < 0)
 | 
							if (hsize < 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue