Hi Øyvind Hvamstad, There is a file called cksum32.uc that comes with the IXP Workbench(Microcode\examples\cksum32.uc). It contains code for verifying IP checksum but you can easily modify it according to your need. I am pasting the code in case you don't have access to the example file. ; Prerequisite Register Usage: ; symbol ; iphdr1 - 1st longword of IP header ; iphdr2 - 2nd longword of IP header ; iphdr3 - 3rd longword of IP header ; iphdr4 - 4th longword of IP header (IP Source Address) ; iphdr5 - 5th longword of IP header (IP Dest Address) ; ; Description: ; The iphdr is assumed to be longword aligned in advance ; If the checksum is bad, a branch to bad_header_checksum# occurs ; alu[accum, iphdr1, +, iphdr2] ; Add 1st and 2nd IP longword alu[accum, accum, +carry, iphdr3] ; Add 3rd IP longword alu[accum, accum, +carry, iphdr4] ; Add 4th IP longword alu[accum, accum, +carry, iphdr5] ; Add 5th IP longword alu[accum, accum, +carry, 0] ; Add any carry ld_field_w_clr[temp, 1100, accum] ; Get high 16 of the total alu_shf[accum, temp, +, accum, <<16] ; Add low 16 bits alu[temp, 1, +carry, temp, <<16] ; add last carry +1, temp B op=0 alu[accum, accum, +, temp, <<16] ; add (1+carry)<<16 to 0xffff to get zero result br!=0[bad_header_checksum#] br[end#] ; bad_header_checksum#: immed[bad_header, 0xFFFF] nop ; transactor - consume cycles end#: ctx_arb[voluntary] br[end#]
participants (1)
-
Hussain, Sajjad