66 #include <sys/param.h> 81 static inline uint32_t _NIOS2_Add_ones_complement_64
82 ( uint32_t sum,
const uint32_t *
const pWd )
84 sum = _NIOS2_Add_ones_complement ( sum, pWd[0] );
85 sum = _NIOS2_Add_ones_complement ( sum, pWd[1] );
86 sum = _NIOS2_Add_ones_complement ( sum, pWd[2] );
87 sum = _NIOS2_Add_ones_complement ( sum, pWd[3] );
88 sum = _NIOS2_Add_ones_complement ( sum, pWd[4] );
89 sum = _NIOS2_Add_ones_complement ( sum, pWd[5] );
90 sum = _NIOS2_Add_ones_complement ( sum, pWd[6] );
91 sum = _NIOS2_Add_ones_complement ( sum, pWd[7] );
92 sum = _NIOS2_Add_ones_complement ( sum, pWd[8] );
93 sum = _NIOS2_Add_ones_complement ( sum, pWd[9] );
94 sum = _NIOS2_Add_ones_complement ( sum, pWd[10] );
95 sum = _NIOS2_Add_ones_complement ( sum, pWd[11] );
96 sum = _NIOS2_Add_ones_complement ( sum, pWd[12] );
97 sum = _NIOS2_Add_ones_complement ( sum, pWd[13] );
98 sum = _NIOS2_Add_ones_complement ( sum, pWd[14] );
99 return _NIOS2_Add_ones_complement ( sum, pWd[15] );
102 static inline uint32_t _NIOS2_Add_ones_complement_32
103 ( uint32_t sum,
const uint32_t *
const pWd )
105 sum = _NIOS2_Add_ones_complement ( sum, pWd[0] );
106 sum = _NIOS2_Add_ones_complement ( sum, pWd[1] );
107 sum = _NIOS2_Add_ones_complement ( sum, pWd[2] );
108 sum = _NIOS2_Add_ones_complement ( sum, pWd[3] );
109 sum = _NIOS2_Add_ones_complement ( sum, pWd[4] );
110 sum = _NIOS2_Add_ones_complement ( sum, pWd[5] );
111 sum = _NIOS2_Add_ones_complement ( sum, pWd[6] );
112 return _NIOS2_Add_ones_complement ( sum, pWd[7] );
115 static inline uint32_t _NIOS2_Add_ones_complement_16
116 ( uint32_t sum,
const uint32_t *
const pWd )
118 sum = _NIOS2_Add_ones_complement ( sum, pWd[0] );
119 sum = _NIOS2_Add_ones_complement ( sum, pWd[1] );
120 sum = _NIOS2_Add_ones_complement ( sum, pWd[2] );
121 return _NIOS2_Add_ones_complement ( sum, pWd[3] );
124 static inline uint32_t _NIOS2_Add_ones_complement_8
125 ( uint32_t sum,
const uint32_t *
const pWd )
127 sum = _NIOS2_Add_ones_complement ( sum, pWd[0] );
128 return _NIOS2_Add_ones_complement ( sum, pWd[1] );
131 static inline uint32_t _NIOS2_Add_ones_complement_4
132 ( uint32_t sum,
const uint32_t *
const pWd )
134 return _NIOS2_Add_ones_complement ( sum, pWd[0] );
137 static inline uint32_t _NIOS2_Reduce_checksum ( uint32_t a )
141 " srli %1, %0, 16 \n" 142 " andi %0, %0, 0xffff \n" 144 :
"+&r"(a),
"=&r"(tmp)
149 #define combineTokens( A, B ) A ## B 151 #define ADD_AND_ADVANCE( N ) \ 153 sum = combineTokens ( _NIOS2_Add_ones_complement_, N ) \ 154 ( sum, ( uint32_t * ) w ); \ 160 in_cksum_internal(
struct mbuf *m,
int off,
int len, u_int sum)
164 int byte_swapped = 0;
166 for (; m && len; m = m->m_next)
170 w = mtod(m, u_char *) + off;
171 mlen = m->m_len - off;
181 if ((3 & (uint32_t)w) != 0)
183 sum = _NIOS2_Reduce_checksum ( sum );
184 if ((1 & (uint32_t)w) != 0 && mlen >= 1)
192 if ((2 & (uint32_t)w) != 0 && mlen >= 2)
194 sum += *(uint16_t *)w;
205 sum = _NIOS2_Add_ones_complement_64
206 ( sum, ( uint32_t * ) w );
210 ADD_AND_ADVANCE ( 32 );
211 ADD_AND_ADVANCE ( 16 );
212 ADD_AND_ADVANCE ( 8 );
213 ADD_AND_ADVANCE ( 4 );
217 sum = _NIOS2_Reduce_checksum ( sum );
220 sum += *(uint16_t *)w;
234 sum = _NIOS2_Reduce_checksum ( sum );
237 sum = _NIOS2_Add_ones_complement_word_halves ( sum );
247 return in_cksum_internal ( m, 0, len, 0 );
263 if (off <
sizeof(
struct ipovly))
264 panic(
"in4_cksum: offset too short");
265 if (m->m_len <
sizeof(
struct ip))
266 panic(
"in4_cksum: bad mbuf chain");
268 bzero(&ipov,
sizeof(ipov));
269 ipov.ih_len = htons(len);
271 ipov.ih_src = mtod(m,
struct ip *)->ip_src;
272 ipov.ih_dst = mtod(m,
struct ip *)->ip_dst;
273 u_char * w = (u_char *)&ipov;
275 if (
sizeof(ipov) != 20 )
276 panic(
"in4_cksum: sizeof(ipov) != 20" );
277 sum = _NIOS2_Add_ones_complement_16 ( sum, (uint32_t *) w );
279 sum = _NIOS2_Add_ones_complement_4 ( sum, (uint32_t *) w );
289 return (in_cksum_internal(m, off, len, sum));
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.