On Sat 18 Jul 2009 21:15, Mike Frysinger pondered: > On Saturday 18 July 2009 20:27:00 Robin Getz wrote: > > On Sat 18 Jul 2009 18:11, Mike Frysinger pondered: > > > keep the modulus something with only 1 bit set so gcc will optimize into > > > a simple and operation. probably add a comment about it too: > > > /* make src port a little random, but use something trivial to compute > > > */ > > > > OK - So, this would give three different variations: > >
So, these are definitality ugly... > > net/tftp.c: TftpOurPort = 1024 + (get_timer(0) % 3072); 00000000 <_random_port>: 0: 78 05 [--SP] = (R7:7); 2: 67 01 [--SP] = RETS; 4: a6 6f SP += -0xc; /* (-12) */ 6: 00 60 R0 = 0x0 (X); /* R0=0x0( 0) */ 8: ff e3 fc ff CALL 0x0 <_random_port>; a: R_BFIN_PCREL24 _get_timer c: 41 e1 aa aa R1.H = 0xaaaa; /* (-21846) R1=0xaaaa000c(-1431699444) */ 10: 01 e1 ab aa R1.L = 0xaaab; /* (-21845) R1=0xaaaaaaab(-1431655765) */ 14: 38 30 R7 = R0; 16: ff e3 f5 ff CALL 0x0 <_random_port>; 18: R_BFIN_PCREL24 ___umulsi3_highpart 1a: 58 4e R0 >>= 0xb; 1c: 21 e1 00 0c R1 = 0xc00 (X); /* R1=0xc00(3072) */ 20: c8 40 R0 *= R1; 22: 66 6c SP += 0xc; /* ( 12) */ 24: c7 53 R7 = R7 - R0; 26: 20 e1 00 04 R0 = 0x400 (X); /* R0=0x400(1024) */ 2a: c7 51 R7 = R7 + R0; 2c: 27 01 RETS = [SP++]; 2e: 07 30 R0 = R7; 30: 38 05 (R7:7) = [SP++]; 32: 10 00 RTS; Disassembly of section .text.NetSetTimeout: > > net/nfs.c: NfsOurPort = 4096 + (get_ticks() % 3072); 00000000 <_random_port>: 0: 67 01 [--SP] = RETS; 2: 86 6f SP += -0x10; /* (-16) */ 4: ff e3 fe ff CALL 0x0 <_random_port>; 6: R_BFIN_PCREL24 _get_ticks 8: 02 60 R2 = 0x0 (X); /* R2=0x0( 0) */ a: f2 b0 [SP + 0xc] = R2; c: 22 e1 00 0c R2 = 0xc00 (X); /* R2=0xc00(3072) */ 10: ff e3 f8 ff CALL 0x0 <_random_port>; 12: R_BFIN_PCREL24 ___umoddi3 14: 86 6c SP += 0x10; /* ( 16) */ 16: 08 30 R1 = R0; 18: 27 01 RETS = [SP++]; 1a: 20 e1 00 10 R0 = 0x1000 (X); /* R0=0x1000(4096) */ 1e: 01 50 R0 = R1 + R0; 20: 10 00 RTS; > > net/sntp.c: SntpOurPort = 10000 + (get_timer(0) % 4096); 00000000 <_random_port>: 0: 67 01 [--SP] = RETS; 2: a6 6f SP += -0xc; /* (-12) */ 4: 00 60 R0 = 0x0 (X); /* R0=0x0( 0) */ 6: ff e3 fd ff CALL 0x0 <_random_port>; 8: R_BFIN_PCREL24 _get_timer a: 21 e1 ff 0f R1 = 0xfff (X); /* R1=0xfff(4095) */ e: 66 6c SP += 0xc; /* ( 12) */ 10: 08 54 R0 = R0 & R1; 12: 27 01 RETS = [SP++]; 14: 21 e1 10 27 R1 = 0x2710 (X); /* R1=0x2710(10000) */ 18: 08 50 R0 = R0 + R1; 1a: 10 00 RTS; Disassembly of section .text.NetSetTimeout: > 1024 + (get_timer(0) % 0x8000); 00000000 <_random_port>: 0: 67 01 [--SP] = RETS; 2: a6 6f SP += -0xc; /* (-12) */ 4: 00 60 R0 = 0x0 (X); /* R0=0x0( 0) */ 6: ff e3 fd ff CALL 0x0 <_random_port>; 8: R_BFIN_PCREL24 _get_timer a: 21 e1 ff 7f R1 = 0x7fff (X); /* R1=0x7fff(32767) */ e: 66 6c SP += 0xc; /* ( 12) */ 10: 08 54 R0 = R0 & R1; 12: 27 01 RETS = [SP++]; 14: 21 e1 00 04 R1 = 0x400 (X); /* R1=0x400(1024) */ 18: 08 50 R0 = R0 + R1; 1a: 10 00 RTS; Disassembly of section .text.NetSetTimeout: > > Does it make sense to have 4 different ones? (not to me)... > > > > Or something new & common in ./net.c:random_port() > > i would make a new patch that adds a new random_port() function and converts > existing consumers to that, and then have the dns code rely on that. > > and you should adopt my implementation because the generated code is > much much nicer than the others ;) At least on Blackfin - the sntp version and yours are computationally equal - although I think yours ends up being more random - so yeah, I'll use that one. > a quick google shows: > - sntp - any non-zero source port is OK > - tftp - "between 0 and 65535" > - nfs - couldnt find anything, but i'm pretty sure there isnt one > > get_ticks() and get_timer(0) are pretty much equivalent Sounds great. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot