aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2008-12-16 02:26:06 -0500
committerDavid S. Miller <davem@davemloft.net>2008-12-16 02:26:06 -0500
commit89319d3801d1d3ac29c7df1f067038986f267d29 (patch)
treea717482d5cdfe9d50bed14a2114ece905b5e88d7 /include/linux
parenteb14f019597cd86c21a6c601d7e900f40030c2e7 (diff)
net: Add frag_list support to skb_segment
This patch adds limited support for handling frag_list packets in skb_segment. The intention is to support GRO (Generic Receive Offload) packets which will be constructed by chaining normal packets using frag_list. As such we require all frag_list members terminate on exact MSS boundaries. This is checked using BUG_ON. As there should only be one producer in the kernel of such packets, namely GRO, this requirement should not be difficult to maintain. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux')
0 files changed, 0 insertions, 0 deletions
ass="hl opt">) { unsigned long j; char *pi, *pj, *pk; j = n / 6 * es; pi = a + j; /* 1/6 */ j += j; pj = pi + j; /* 1/2 */ pk = pj + j; /* 5/6 */ if ( anagram_CompareFrequency( pi, pj ) < 0 ) { if ( anagram_CompareFrequency( pi, pk ) < 0 ) { if ( anagram_CompareFrequency( pj, pk ) < 0 ) return pj; return pk; } return pi; } if ( anagram_CompareFrequency( pj, pk ) < 0 ) { if ( anagram_CompareFrequency( pi, pk ) < 0 ) return pi; return pk; } return pj; } void anagram_qsorts( char *a, unsigned long n, unsigned long es ) { unsigned long j; char *pi, *pj, *pn; volatile unsigned int flowfactdummy = 0; _Pragma( "loopbound min 0 max 6" ) while ( n > 1 ) { if ( n > 10 ) pi = anagram_pivot( a, n, es ); else pi = a + ( n >> 1 ) * es; anagram_swapi( a, pi, es ); pi = a; pn = a + n * es; pj = pn; _Pragma( "loopbound min 1 max 11" ) while ( 1 ) { /* wcc note: this assignment expression was added to avoid assignment of multiple loop bound annotations to same loop (cf. Ticket #0002323). */ flowfactdummy ++; _Pragma( "loopbound min 1 max 5" ) do { pi += es; } while ( pi < pn && anagram_CompareFrequency( pi, a ) < 0 ); _Pragma( "loopbound min 1 max 4" ) do { pj -= es; } while ( pj > a && anagram_CompareFrequency( pj, a ) > 0 ); if ( pj < pi ) break; anagram_swapi( pi, pj, es ); } anagram_swapi( a, pj, es ); j = ( unsigned long )( pj - a ) / es; n = n - j - 1; if ( j >= n ) { anagram_qsorts( a, j, es ); a += ( j + 1 ) * es; } else { anagram_qsorts( a + ( j + 1 )*es, n, es ); n = j; } } } void anagram_qsort( void *va, unsigned long n, unsigned long es ) { _Pragma( "marker call_qsorts" ) anagram_qsorts( ( char * )va, n, es ); _Pragma( "flowrestriction 1*anagram_qsorts <= 17*call_qsorts" ) } /* This must be redefined for each new benchmark */ #define ANAGRAM_HEAP_SIZE 20388 static char anagram_simulated_heap[ANAGRAM_HEAP_SIZE]; static unsigned int anagram_freeHeapPos; void *anagram_malloc( unsigned int numberOfBytes ) { void *currentPos = ( void * )&anagram_simulated_heap[ anagram_freeHeapPos ]; /* Get a 4-byte address for alignment purposes */ //anagram_freeHeapPos += ( ( numberOfBytes + 4 ) & ( unsigned int )0xfffffffc ); unsigned int rem = (numberOfBytes & ( unsigned int )0x3 ); unsigned int adjustment = rem ? 4 - rem : 0; anagram_freeHeapPos += numberOfBytes + adjustment; return currentPos; } void anagram_free_all( void ) { anagram_freeHeapPos = 0; } void anagram_bzero( char *p, unsigned long len ) { unsigned long i; _Pragma( "loopbound min 8 max 416" ) for ( i = 0; i < len; ++ i ) *p ++ = '\0'; }