1 .file "tcp.c" 2 .arch atmega8 3 __SREG__ = 0x3f 4 __SP_H__ = 0x3e 5 __SP_L__ = 0x3d 6 __tmp_reg__ = 0 7 __zero_reg__ = 1 8 .global __do_copy_data 9 .global __do_clear_bss 12 .text 13 .Ltext0: 115 .global tcp_store 117 tcp_store: 118 .stabd 46,0,0 1:tcp.c **** /*####################################################################################### 2:tcp.c **** AVR Small Webserver 3:tcp.c **** 4:tcp.c **** Copyright (C) 2004 Ulrich Radig 5:tcp.c **** 6:tcp.c **** #######################################################################################*/ 7:tcp.c **** 8:tcp.c **** #include "main.h" 9:tcp.c **** #include "tcp.h" 10:tcp.c **** // #include "mmc.h" 11:tcp.c **** 12:tcp.c **** //Globale Variablen 13:tcp.c **** unsigned long Seq_counter; 14:tcp.c **** unsigned long Ack_counter; 15:tcp.c **** 16:tcp.c **** struct TCP_Socket tcpsockets[Max_TCP_Sockets]; //Feld mit Max_TCP_Sockets Sockets 17:tcp.c **** struct TCP_Socket *tcp_socket; //Pointer auf einen TCP_Socket 18:tcp.c **** 19:tcp.c **** PGM_P pointerold; 20:tcp.c **** 21:tcp.c **** unsigned int sitecounter=0; 22:tcp.c **** unsigned char password[16] = { 0 }; 23:tcp.c **** 24:tcp.c **** //############################################################################ 25:tcp.c **** // 26:tcp.c **** void tcp_store (char *buffer) 27:tcp.c **** //############################################################################ 28:tcp.c **** { 120 .LM0: 121 /* prologue: frame size=0 */ 122 0000 EF92 push r14 123 0002 FF92 push r15 124 0004 0F93 push r16 125 0006 1F93 push r17 126 0008 CF93 push r28 127 000a DF93 push r29 128 /* prologue end (size=6) */ 129 000c EC01 movw r28,r24 29:tcp.c **** //Variablen Fr die Routine 30:tcp.c **** unsigned int result16; 31:tcp.c **** 32:tcp.c **** //Pointer auf TCP_Header 33:tcp.c **** struct TCP_Header *tcp; 34:tcp.c **** tcp = (struct TCP_Header *)&buffer[TCP_OFFSET]; 131 .LM1: 132 000e FC01 movw r30,r24 133 0010 B296 adiw r30,34 35:tcp.c **** 36:tcp.c **** //Store seq number to Seq_counter 37:tcp.c **** Seq_counter = (tcp->TCP_Seqnum[0] << 8)+tcp->TCP_Seqnum[1]; 38:tcp.c **** Seq_counter = Seq_counter << 16; 135 .LM2: 136 0012 8481 ldd r24,Z+4 137 0014 9927 clr r25 138 0016 982F mov r25,r24 139 0018 8827 clr r24 140 001a 2581 ldd r18,Z+5 141 001c 820F add r24,r18 142 001e 911D adc r25,__zero_reg__ 143 0020 AA27 clr r26 144 0022 97FD sbrc r25,7 145 0024 A095 com r26 146 0026 BA2F mov r27,r26 147 0028 DC01 movw r26,r24 148 002a 9927 clr r25 149 002c 8827 clr r24 150 002e 8093 0000 sts Seq_counter,r24 151 0032 9093 0000 sts (Seq_counter)+1,r25 152 0036 A093 0000 sts (Seq_counter)+2,r26 153 003a B093 0000 sts (Seq_counter)+3,r27 39:tcp.c **** Seq_counter = Seq_counter +(unsigned int) ((tcp->TCP_Seqnum[2] << 8) 155 .LM3: 156 003e 2681 ldd r18,Z+6 157 0040 3327 clr r19 158 0042 322F mov r19,r18 159 0044 2227 clr r18 160 0046 4781 ldd r20,Z+7 161 0048 240F add r18,r20 162 004a 311D adc r19,__zero_reg__ 163 004c 7901 movw r14,r18 164 004e 0027 clr r16 165 0050 1127 clr r17 166 0052 E80E add r14,r24 167 0054 F91E adc r15,r25 168 0056 0A1F adc r16,r26 169 0058 1B1F adc r17,r27 170 005a E092 0000 sts Seq_counter,r14 171 005e F092 0000 sts (Seq_counter)+1,r15 172 0062 0093 0000 sts (Seq_counter)+2,r16 173 0066 1093 0000 sts (Seq_counter)+3,r17 40:tcp.c **** +tcp->TCP_Seqnum[3]); 41:tcp.c **** 42:tcp.c **** //Store ack number to ACK_counter 43:tcp.c **** Ack_counter = (tcp->TCP_Acknum[0] << 8)+tcp->TCP_Acknum[1]; 44:tcp.c **** Ack_counter = Ack_counter << 16; 175 .LM4: 176 006a 2085 ldd r18,Z+8 177 006c 3327 clr r19 178 006e 322F mov r19,r18 179 0070 2227 clr r18 180 0072 8185 ldd r24,Z+9 181 0074 280F add r18,r24 182 0076 311D adc r19,__zero_reg__ 183 0078 4427 clr r20 184 007a 37FD sbrc r19,7 185 007c 4095 com r20 186 007e 542F mov r21,r20 187 0080 A901 movw r20,r18 188 0082 3327 clr r19 189 0084 2227 clr r18 190 0086 2093 0000 sts Ack_counter,r18 191 008a 3093 0000 sts (Ack_counter)+1,r19 192 008e 4093 0000 sts (Ack_counter)+2,r20 193 0092 5093 0000 sts (Ack_counter)+3,r21 45:tcp.c **** Ack_counter = Ack_counter +(unsigned int) ((tcp->TCP_Acknum[2] << 8) 195 .LM5: 196 0096 8285 ldd r24,Z+10 197 0098 9927 clr r25 198 009a 982F mov r25,r24 199 009c 8827 clr r24 200 009e 6385 ldd r22,Z+11 201 00a0 860F add r24,r22 202 00a2 911D adc r25,__zero_reg__ 203 00a4 AA27 clr r26 204 00a6 BB27 clr r27 205 00a8 280F add r18,r24 206 00aa 391F adc r19,r25 207 00ac 4A1F adc r20,r26 208 00ae 5B1F adc r21,r27 209 00b0 2093 0000 sts Ack_counter,r18 210 00b4 3093 0000 sts (Ack_counter)+1,r19 211 00b8 4093 0000 sts (Ack_counter)+2,r20 212 00bc 5093 0000 sts (Ack_counter)+3,r21 46:tcp.c **** +tcp->TCP_Acknum[3]); 47:tcp.c **** 48:tcp.c **** //Calculate next seq number 49:tcp.c **** if ((tcp->TCP_HdrFlags[1] & FIN_FLAG) == 0) 214 .LM6: 215 00c0 8585 ldd r24,Z+13 216 00c2 80FD sbrc r24,0 217 00c4 32C0 rjmp .L7 50:tcp.c **** { 51:tcp.c **** result16 = (buffer[IP_PKTLEN]<<8) + buffer[IP_PKTLEN+1]; 52:tcp.c **** result16 = result16 - ((buffer[IP_VERS_LEN] & 0x0F) << 2) 219 .LM7: 220 00c6 8889 ldd r24,Y+16 221 00c8 9927 clr r25 222 00ca 382F mov r19,r24 223 00cc 2227 clr r18 224 00ce 8989 ldd r24,Y+17 225 00d0 280F add r18,r24 226 00d2 311D adc r19,__zero_reg__ 227 00d4 8E85 ldd r24,Y+14 228 00d6 9927 clr r25 229 00d8 8F70 andi r24,lo8(15) 230 00da 9070 andi r25,hi8(15) 231 00dc 880F lsl r24 232 00de 991F rol r25 233 00e0 880F lsl r24 234 00e2 991F rol r25 235 00e4 281B sub r18,r24 236 00e6 390B sbc r19,r25 237 00e8 8EA5 ldd r24,Y+46 238 00ea 9927 clr r25 239 00ec 807F andi r24,lo8(240) 240 00ee 9070 andi r25,hi8(240) 241 00f0 9595 asr r25 242 00f2 8795 ror r24 243 00f4 9595 asr r25 244 00f6 8795 ror r24 245 00f8 281B sub r18,r24 246 00fa 390B sbc r19,r25 53:tcp.c **** - ((buffer[TCP_HDRFLAGS] & 0xF0) >>2); 54:tcp.c **** 55:tcp.c **** if ((buffer[TCP_HDRFLAGS+1]&SYN_FLAG) > 0 248 .LM8: 249 00fc 8FA5 ldd r24,Y+47 250 00fe 81FF sbrs r24,1 251 0100 05C0 rjmp .L4 252 0102 2115 cp r18,__zero_reg__ 253 0104 3105 cpc r19,__zero_reg__ 254 0106 11F4 brne .L4 255 0108 21E0 ldi r18,lo8(1) 256 010a 30E0 ldi r19,hi8(1) 257 .L4: 56:tcp.c **** && result16 == 0) 57:tcp.c **** { 58:tcp.c **** result16 = 1; 59:tcp.c **** } 60:tcp.c **** Seq_counter =Seq_counter + result16; 259 .LM9: 260 010c C901 movw r24,r18 261 010e AA27 clr r26 262 0110 BB27 clr r27 263 0112 E80E add r14,r24 264 0114 F91E adc r15,r25 265 0116 0A1F adc r16,r26 266 0118 1B1F adc r17,r27 267 011a E092 0000 sts Seq_counter,r14 268 011e F092 0000 sts (Seq_counter)+1,r15 269 0122 0093 0000 sts (Seq_counter)+2,r16 270 0126 1093 0000 sts (Seq_counter)+3,r17 271 .L7: 272 /* epilogue: frame size=0 */ 273 012a DF91 pop r29 274 012c CF91 pop r28 275 012e 1F91 pop r17 276 0130 0F91 pop r16 277 0132 FF90 pop r15 278 0134 EF90 pop r14 279 0136 0895 ret 280 /* epilogue end (size=7) */ 281 /* function tcp_store size 156 (143) */ 287 .Lscope0: 289 .stabd 78,0,0 294 .global TCP_New_Packtlen 296 TCP_New_Packtlen: 297 .stabd 46,0,0 61:tcp.c **** } 62:tcp.c **** return; 63:tcp.c **** } 64:tcp.c **** 65:tcp.c **** // check if an output pin is 1 or 0 and return "on" or "off" accordingly 66:tcp.c **** void PortOnOff(unsigned char * StringPointer, unsigned char Mask) 67:tcp.c **** { 68:tcp.c **** if (PORTD & Mask) 69:tcp.c **** memcpy(StringPointer, "on\0", 3); 70:tcp.c **** else 71:tcp.c **** memcpy(StringPointer, "off\0", 4); 72:tcp.c **** return; 73:tcp.c **** } 74:tcp.c **** 75:tcp.c **** // check if an input pin is 1 or 0 and return "off" or "on" accordingly (inverted!) 76:tcp.c **** void PinOnOff(unsigned char * StringPointer, unsigned char Mask) 77:tcp.c **** { 78:tcp.c **** if (PINC & Mask) 79:tcp.c **** memcpy(StringPointer, "off\0", 3); 80:tcp.c **** else 81:tcp.c **** memcpy(StringPointer, "on\0", 4); 82:tcp.c **** return; 83:tcp.c **** } 84:tcp.c **** 85:tcp.c **** //############################################################################ 86:tcp.c **** // 87:tcp.c **** unsigned char tcp_add_data (PGM_P pointer,char *buffer,int *bufferlen) 88:tcp.c **** //############################################################################ 89:tcp.c **** { 90:tcp.c **** //Variablen Fr die Routine 91:tcp.c **** unsigned int result16; 92:tcp.c **** unsigned char Data = 1; 93:tcp.c **** unsigned char Buffer_Full = 0; 94:tcp.c **** 95:tcp.c **** 96:tcp.c **** //Errechnet startpunkt der Daten im Tcp buffer 97:tcp.c **** //IP Headerl�ge + TCP Headerl�ge + Ethernetframe 98:tcp.c **** result16 = ((buffer[IP_VERS_LEN] & 0x0F) << 2) + 99:tcp.c **** ((buffer[TCP_HDRFLAGS] & 0xF0) >>2) + 14; 100:tcp.c **** 101:tcp.c **** for(;;) 102:tcp.c **** { 103:tcp.c **** Data = pgm_read_byte_near(pointer++); 104:tcp.c **** buffer[result16] = Data; 105:tcp.c **** result16++; 106:tcp.c **** //sind die daten l�ger als ein Ethernetbuffer dann abbruch 107:tcp.c **** if (result16 > (MTU_SIZE - 1)) 108:tcp.c **** { 109:tcp.c **** Buffer_Full = 1; 110:tcp.c **** //Speichern des Pointers 111:tcp.c **** pointerold = pointer; 112:tcp.c **** //Abbruch der Schleife 113:tcp.c **** break; 114:tcp.c **** } 115:tcp.c **** 116:tcp.c **** //% bedeutet es kommt evt. was besonderes! 117:tcp.c **** if (pgm_read_byte(pointer) =='%') 118:tcp.c **** { 119:tcp.c **** unsigned char OnOff[4] = "\0\0\0\0"; 120:tcp.c **** // REL -> status of relay output 121:tcp.c **** if (strncmp_P("REL",(pointer+1),3) == 0) 122:tcp.c **** { 123:tcp.c **** pointer+=4; 124:tcp.c **** PortOnOff(OnOff, 0x10); 125:tcp.c **** } 126:tcp.c **** 127:tcp.c **** // OUT -> status of normal output 128:tcp.c **** if (strncmp_P("OUT",(pointer+1),3) == 0) 129:tcp.c **** { 130:tcp.c **** pointer+=4; 131:tcp.c **** PortOnOff(OnOff, 0x08); 132:tcp.c **** } 133:tcp.c **** 134:tcp.c **** // INP -> status of input 135:tcp.c **** if (strncmp_P("INP",(pointer+1),3) == 0) 136:tcp.c **** { 137:tcp.c **** pointer+=4; 138:tcp.c **** PinOnOff(OnOff, 0x20); 139:tcp.c **** } 140:tcp.c **** 141:tcp.c **** // Send string 142:tcp.c **** unsigned char i = 0; 143:tcp.c **** while (OnOff[i] != '\0') 144:tcp.c **** { 145:tcp.c **** buffer[result16++] = OnOff[i++]; 146:tcp.c **** } 147:tcp.c **** 148:tcp.c **** //Abbruch wenn %END erreicht wurde 149:tcp.c **** if (strncmp_P("END",(pointer+1),3) == 0) 150:tcp.c **** { 151:tcp.c **** //Wait a short Time 152:tcp.c **** for(int a = 0;a<1000;a++){nop();}; 153:tcp.c **** break; 154:tcp.c **** } 155:tcp.c **** } 156:tcp.c **** } 157:tcp.c **** TCP_New_Packtlen (buffer,bufferlen,result16); 158:tcp.c **** return(Buffer_Full); 159:tcp.c **** } 160:tcp.c **** 161:tcp.c **** //############################################################################ 162:tcp.c **** // 163:tcp.c **** char tcp_add_datastring (char *pointer,char *buffer,int *bufferlen) 164:tcp.c **** //############################################################################ 165:tcp.c **** { 166:tcp.c **** //Variablen Fr die Routine 167:tcp.c **** unsigned int result16; 168:tcp.c **** unsigned char Data = 1; 169:tcp.c **** unsigned char Buffer_Full = 0; 170:tcp.c **** 171:tcp.c **** 172:tcp.c **** //Errechnet startpunkt der Daten im Tcp buffer 173:tcp.c **** //IP Headerl�ge + TCP Headerl�ge + Ethernetframe 174:tcp.c **** result16 = ((buffer[IP_VERS_LEN] & 0x0F) << 2) + 175:tcp.c **** ((buffer[TCP_HDRFLAGS] & 0xF0) >>2) + 14; 176:tcp.c **** 177:tcp.c **** for(;;) 178:tcp.c **** { 179:tcp.c **** Data = *pointer++; 180:tcp.c **** buffer[result16] = Data; 181:tcp.c **** result16++; 182:tcp.c **** //sind die daten l�ger als ein Ethernetbuffer dann abbruch 183:tcp.c **** if (result16 > (MTU_SIZE - 1)) 184:tcp.c **** { 185:tcp.c **** Buffer_Full = 1; 186:tcp.c **** break; 187:tcp.c **** } 188:tcp.c **** //Abbruch wenn 0 erreicht wurde 189:tcp.c **** if (*pointer == 0) 190:tcp.c **** { 191:tcp.c **** //Wait a short Time 192:tcp.c **** for(int a = 0;a<1000;a++){nop();}; 193:tcp.c **** break; 194:tcp.c **** } 195:tcp.c **** } 196:tcp.c **** TCP_New_Packtlen (buffer,bufferlen,result16); 197:tcp.c **** return(Buffer_Full); 198:tcp.c **** } 199:tcp.c **** 200:tcp.c **** //############################################################################ 201:tcp.c **** // 202:tcp.c **** void TCP_New_Packtlen (char *buffer,int *bufferlen,unsigned int result16) 203:tcp.c **** //############################################################################ 204:tcp.c **** { 299 .LM10: 300 /* prologue: frame size=0 */ 301 /* prologue end (size=0) */ 302 0138 DC01 movw r26,r24 303 013a FB01 movw r30,r22 205:tcp.c **** //addiert noch bufferheader zur neuen ethernetl�ge 206:tcp.c **** result16 = result16 + 4; 305 .LM11: 306 013c 4C5F subi r20,lo8(-(4)) 307 013e 5F4F sbci r21,hi8(-(4)) 207:tcp.c **** *bufferlen = result16; 309 .LM12: 310 0140 5183 std Z+1,r21 311 0142 4083 st Z,r20 208:tcp.c **** //Errechnet die neue ip bufferl�ge aus Ethernet L�ge 209:tcp.c **** //Ethernetframe - bufferheader 210:tcp.c **** result16 = result16 - 18; 313 .LM13: 314 0144 4251 subi r20,lo8(-(-18)) 315 0146 5040 sbci r21,hi8(-(-18)) 211:tcp.c **** //schreibt neue IPl�ge ins buffer (ip_pktlenH) 212:tcp.c **** buffer[IP_PKTLEN] = ((result16 & 0xFF00) >> 8); 317 .LM14: 318 0148 852F mov r24,r21 319 014a 9927 clr r25 320 014c FD01 movw r30,r26 321 014e 808B std Z+16,r24 213:tcp.c **** //schreibt neue IPl�ge ins buffer (ip_pktlenL) 214:tcp.c **** buffer[IP_PKTLEN+1] = (result16 & 0x00FF); 323 .LM15: 324 0150 418B std Z+17,r20 325 /* epilogue: frame size=0 */ 326 0152 0895 ret 327 /* epilogue end (size=1) */ 328 /* function TCP_New_Packtlen size 14 (13) */ 330 .Lscope1: 332 .stabd 78,0,0 337 .global tcp_add_datastring 339 tcp_add_datastring: 340 .stabd 46,0,0 342 .LM16: 343 /* prologue: frame size=0 */ 344 0154 1F93 push r17 345 0156 CF93 push r28 346 0158 DF93 push r29 347 /* prologue end (size=3) */ 348 015a DC01 movw r26,r24 349 015c EB01 movw r28,r22 350 015e BA01 movw r22,r20 352 .LM17: 353 0160 8EA5 ldd r24,Y+46 354 0162 482F mov r20,r24 355 0164 5527 clr r21 356 0166 407F andi r20,lo8(240) 357 0168 5070 andi r21,hi8(240) 358 016a 5595 asr r21 359 016c 4795 ror r20 360 016e 5595 asr r21 361 0170 4795 ror r20 362 0172 8E85 ldd r24,Y+14 363 0174 9927 clr r25 364 0176 8F70 andi r24,lo8(15) 365 0178 9070 andi r25,hi8(15) 366 017a 880F lsl r24 367 017c 991F rol r25 368 017e 880F lsl r24 369 0180 991F rol r25 370 0182 0E96 adiw r24,14 371 0184 480F add r20,r24 372 0186 591F adc r21,r25 373 0188 FE01 movw r30,r28 374 018a E40F add r30,r20 375 018c F51F adc r31,r21 376 .L11: 378 .LM18: 379 018e 8C91 ld r24,X 380 0190 8083 st Z,r24 382 .LM19: 383 0192 4F5F subi r20,lo8(-(1)) 384 0194 5F4F sbci r21,hi8(-(1)) 386 .LM20: 387 0196 21E0 ldi r18,hi8(500) 388 0198 443F cpi r20,lo8(500) 389 019a 5207 cpc r21,r18 390 019c 10F0 brlo .L12 391 019e 11E0 ldi r17,lo8(1) 392 01a0 0EC0 rjmp .L14 393 .L12: 395 .LM21: 396 01a2 1196 adiw r26,1 397 01a4 3196 adiw r30,1 399 .LM22: 400 01a6 8C91 ld r24,X 401 01a8 8823 tst r24 402 01aa 89F7 brne .L11 403 01ac 80E0 ldi r24,lo8(0) 404 01ae 90E0 ldi r25,hi8(0) 405 .L16: 406 .LBB2: 408 .LM23: 409 /* #APP */ 410 01b0 0000 nop 411 /* #NOAPP */ 412 01b2 0196 adiw r24,1 413 01b4 23E0 ldi r18,hi8(1000) 414 01b6 883E cpi r24,lo8(1000) 415 01b8 9207 cpc r25,r18 416 01ba D1F7 brne .L16 417 01bc 10E0 ldi r17,lo8(0) 418 .L14: 419 .LBE2: 421 .LM24: 422 01be CE01 movw r24,r28 423 01c0 BBDF rcall TCP_New_Packtlen 425 .LM25: 426 01c2 812F mov r24,r17 427 01c4 9927 clr r25 428 /* epilogue: frame size=0 */ 429 01c6 DF91 pop r29 430 01c8 CF91 pop r28 431 01ca 1F91 pop r17 432 01cc 0895 ret 433 /* epilogue end (size=4) */ 434 /* function tcp_add_datastring size 62 (55) */ 443 .Lscope2: 445 .stabd 78,0,0 448 .global tcp_make 450 tcp_make: 451 .stabd 46,0,0 215:tcp.c **** return; 216:tcp.c **** } 217:tcp.c **** 218:tcp.c **** //############################################################################ 219:tcp.c **** // 220:tcp.c **** void tcp_make (char *buffer) 221:tcp.c **** //############################################################################ 222:tcp.c **** { 453 .LM26: 454 /* prologue: frame size=0 */ 455 01ce 0F93 push r16 456 01d0 1F93 push r17 457 /* prologue end (size=2) */ 458 01d2 8C01 movw r16,r24 223:tcp.c **** //Variablen Fr die Routine 224:tcp.c **** unsigned int result16; 225:tcp.c **** unsigned long result32 = 0x00000000; 226:tcp.c **** unsigned char DataH; 227:tcp.c **** unsigned char DataL; 228:tcp.c **** 229:tcp.c **** //Schreibt neuen seq und Ack Counter 230:tcp.c **** buffer[TCP_ACKNUM] = (Seq_counter & 0xFF000000) >> 24; 460 .LM27: 461 01d4 8091 0000 lds r24,Seq_counter 462 01d8 9091 0000 lds r25,(Seq_counter)+1 463 01dc A091 0000 lds r26,(Seq_counter)+2 464 01e0 B091 0000 lds r27,(Seq_counter)+3 465 01e4 8B2F mov r24,r27 466 01e6 9927 clr r25 467 01e8 AA27 clr r26 468 01ea BB27 clr r27 469 01ec F801 movw r30,r16 470 01ee 82A7 std Z+42,r24 231:tcp.c **** buffer[TCP_ACKNUM+1] = (Seq_counter & 0x00FF0000) >> 16; 472 .LM28: 473 01f0 8091 0000 lds r24,Seq_counter 474 01f4 9091 0000 lds r25,(Seq_counter)+1 475 01f8 A091 0000 lds r26,(Seq_counter)+2 476 01fc B091 0000 lds r27,(Seq_counter)+3 477 0200 A3A7 std Z+43,r26 232:tcp.c **** buffer[TCP_ACKNUM+2] = (Seq_counter & 0x0000FF00) >> 8; 479 .LM29: 480 0202 8091 0000 lds r24,Seq_counter 481 0206 9091 0000 lds r25,(Seq_counter)+1 482 020a A091 0000 lds r26,(Seq_counter)+2 483 020e B091 0000 lds r27,(Seq_counter)+3 484 0212 94A7 std Z+44,r25 233:tcp.c **** buffer[TCP_ACKNUM+3] = Seq_counter & 0x000000FF; 486 .LM30: 487 0214 8091 0000 lds r24,Seq_counter 488 0218 85A7 std Z+45,r24 234:tcp.c **** 235:tcp.c **** buffer[TCP_SEQNUM] = (Ack_counter & 0xFF000000) >> 24; 490 .LM31: 491 021a 8091 0000 lds r24,Ack_counter 492 021e 9091 0000 lds r25,(Ack_counter)+1 493 0222 A091 0000 lds r26,(Ack_counter)+2 494 0226 B091 0000 lds r27,(Ack_counter)+3 495 022a 8B2F mov r24,r27 496 022c 9927 clr r25 497 022e AA27 clr r26 498 0230 BB27 clr r27 499 0232 86A3 std Z+38,r24 236:tcp.c **** buffer[TCP_SEQNUM+1] = (Ack_counter & 0x00FF0000) >> 16; 501 .LM32: 502 0234 8091 0000 lds r24,Ack_counter 503 0238 9091 0000 lds r25,(Ack_counter)+1 504 023c A091 0000 lds r26,(Ack_counter)+2 505 0240 B091 0000 lds r27,(Ack_counter)+3 506 0244 A7A3 std Z+39,r26 237:tcp.c **** buffer[TCP_SEQNUM+2] = (Ack_counter & 0x0000FF00) >> 8; 508 .LM33: 509 0246 8091 0000 lds r24,Ack_counter 510 024a 9091 0000 lds r25,(Ack_counter)+1 511 024e A091 0000 lds r26,(Ack_counter)+2 512 0252 B091 0000 lds r27,(Ack_counter)+3 513 0256 90A7 std Z+40,r25 238:tcp.c **** buffer[TCP_SEQNUM+3] = Ack_counter & 0x000000FF; 515 .LM34: 516 0258 8091 0000 lds r24,Ack_counter 517 025c 81A7 std Z+41,r24 239:tcp.c **** 240:tcp.c **** //Tauscht den TCP source Port mit TCP destinations port yyyy >> XXXX 241:tcp.c **** 242:tcp.c **** DataH = buffer[TCP_SRCPORT]; 519 .LM35: 520 025e 92A1 ldd r25,Z+34 243:tcp.c **** buffer[TCP_SRCPORT] = buffer[TCP_DESTPORT]; 522 .LM36: 523 0260 84A1 ldd r24,Z+36 524 0262 82A3 std Z+34,r24 244:tcp.c **** buffer[TCP_DESTPORT] = DataH; 526 .LM37: 527 0264 94A3 std Z+36,r25 245:tcp.c **** 246:tcp.c **** DataL = buffer[TCP_SRCPORT+1]; 529 .LM38: 530 0266 93A1 ldd r25,Z+35 247:tcp.c **** buffer[TCP_SRCPORT+1] = buffer[TCP_DESTPORT+1]; 532 .LM39: 533 0268 85A1 ldd r24,Z+37 534 026a 83A3 std Z+35,r24 248:tcp.c **** buffer[TCP_DESTPORT+1] = DataL; 536 .LM40: 537 026c 95A3 std Z+37,r25 249:tcp.c **** 250:tcp.c **** //Erzeugt den IP Header 251:tcp.c **** Make_IP_Header(buffer); 539 .LM41: 540 026e C801 movw r24,r16 541 0270 00D0 rcall Make_IP_Header 252:tcp.c **** 253:tcp.c **** //Berechnung der TCP Checksumme 254:tcp.c **** //Alle Daten im TCP Header werden addiert checksum wird deshalb 255:tcp.c **** //ersteinmal auf null gesetzt 256:tcp.c **** buffer[TCP_CHKSUM] = 0x00; 543 .LM42: 544 0272 F801 movw r30,r16 545 0274 12AA std Z+50,__zero_reg__ 257:tcp.c **** buffer[TCP_CHKSUM+1] = 0x00; 547 .LM43: 548 0276 13AA std Z+51,__zero_reg__ 258:tcp.c **** 259:tcp.c **** //Berechnet Headerl�ge und Addiert Pseudoheaderl�ge 2XIP = 8 260:tcp.c **** result16 = (buffer[IP_PKTLEN]<<8) + buffer[IP_PKTLEN+1] + 8; 550 .LM44: 551 0278 6089 ldd r22,Z+16 552 027a 7727 clr r23 553 027c 762F mov r23,r22 554 027e 6627 clr r22 555 0280 8189 ldd r24,Z+17 556 0282 9927 clr r25 557 0284 0896 adiw r24,8 558 0286 680F add r22,r24 559 0288 791F adc r23,r25 261:tcp.c **** result16 = result16 - ((buffer[IP_VERS_LEN] & 0x0F) << 2); 561 .LM45: 562 028a 8685 ldd r24,Z+14 563 028c 9927 clr r25 564 028e 8F70 andi r24,lo8(15) 565 0290 9070 andi r25,hi8(15) 566 0292 880F lsl r24 567 0294 991F rol r25 568 0296 880F lsl r24 569 0298 991F rol r25 570 029a 681B sub r22,r24 571 029c 790B sbc r23,r25 262:tcp.c **** result32 = result16 - 2; 263:tcp.c **** 264:tcp.c **** //Pointer wird auf das erste buffer im IP Header gesetzt 265:tcp.c **** //Routine berechnet die Checksumme 266:tcp.c **** result16 = checksum (&buffer[IP_SRCADDR], result16, result32); 573 .LM46: 574 029e 6250 subi r22,lo8(-(-2)) 575 02a0 7040 sbci r23,hi8(-(-2)) 576 02a2 9B01 movw r18,r22 577 02a4 4427 clr r20 578 02a6 5527 clr r21 579 02a8 6E5F subi r22,lo8(-(2)) 580 02aa 7F4F sbci r23,hi8(-(2)) 581 02ac C801 movw r24,r16 582 02ae 4A96 adiw r24,26 583 02b0 00D0 rcall checksum 267:tcp.c **** 268:tcp.c **** //schreibt checksum ins buffer (INT H Byte) 269:tcp.c **** buffer[TCP_CHKSUM] = ((result16 & 0xFF00) >> 8); 585 .LM47: 586 02b2 292F mov r18,r25 587 02b4 3327 clr r19 588 02b6 F801 movw r30,r16 589 02b8 22AB std Z+50,r18 270:tcp.c **** 271:tcp.c **** //schreibt checksum ins buffer (INT L Byte) 272:tcp.c **** buffer[TCP_CHKSUM+1] = (result16 & 0x00FF); 591 .LM48: 592 02ba 83AB std Z+51,r24 593 /* epilogue: frame size=0 */ 594 02bc 1F91 pop r17 595 02be 0F91 pop r16 596 02c0 0895 ret 597 /* epilogue end (size=3) */ 598 /* function tcp_make size 122 (117) */ 604 .Lscope3: 606 .stabd 78,0,0 610 .global TCP_OPEN 612 TCP_OPEN: 613 .stabd 46,0,0 273:tcp.c **** 274:tcp.c **** //Habe Fertig!! 275:tcp.c **** } 276:tcp.c **** 277:tcp.c **** //############################################################################ 278:tcp.c **** // 279:tcp.c **** void TCP_PORT_CLOSE (char *buffer,int *bufferlen) 280:tcp.c **** //############################################################################ 281:tcp.c **** { 282:tcp.c **** //Speichert Sequenzcounter und Aknowledgecounter 283:tcp.c **** tcp_store(buffer); 284:tcp.c **** //Setzen des FIN Flag 285:tcp.c **** buffer[TCP_HDRFLAGS+1] = ACK_FLAG | FIN_FLAG | PSH_FLAG; 286:tcp.c **** 287:tcp.c **** //Erzeugt ein TCP buffer 288:tcp.c **** tcp_make(buffer); 289:tcp.c **** //Sendet das erzeugte TCP buffer 290:tcp.c **** Write_Ethernet_Frame (buffer,*bufferlen); 291:tcp.c **** } 292:tcp.c **** 293:tcp.c **** //############################################################################ 294:tcp.c **** // 295:tcp.c **** int TCP_OPEN (char *buffer,int *bufferlen) 296:tcp.c **** //############################################################################ 297:tcp.c **** { 615 .LM49: 616 /* prologue: frame size=0 */ 617 02c2 EF92 push r14 618 02c4 FF92 push r15 619 02c6 0F93 push r16 620 02c8 1F93 push r17 621 02ca CF93 push r28 622 02cc DF93 push r29 623 /* prologue end (size=6) */ 624 02ce EC01 movw r28,r24 625 02d0 7B01 movw r14,r22 298:tcp.c **** unsigned int tcp_srcport; 299:tcp.c **** 300:tcp.c **** tcp_srcport=(buffer[TCP_SRCPORT]<<8) + buffer[TCP_SRCPORT+1]; 627 .LM50: 628 02d2 8AA1 ldd r24,Y+34 629 02d4 9927 clr r25 630 02d6 582F mov r21,r24 631 02d8 4427 clr r20 632 02da 8BA1 ldd r24,Y+35 633 02dc 480F add r20,r24 634 02de 511D adc r21,__zero_reg__ 301:tcp.c **** 302:tcp.c **** unsigned char tcp_hdrflags1=buffer[TCP_HDRFLAGS+1]; 636 .LM51: 637 02e0 8E01 movw r16,r28 638 02e2 015D subi r16,lo8(-(47)) 639 02e4 1F4F sbci r17,hi8(-(47)) 303:tcp.c **** 304:tcp.c **** if ((tcp_hdrflags1 & SYN_FLAG) > 0 641 .LM52: 642 02e6 8FA5 ldd r24,Y+47 643 02e8 282F mov r18,r24 644 02ea 3327 clr r19 645 02ec 21FF sbrs r18,1 646 02ee 1FC0 rjmp .L26 648 .LM53: 649 02f0 C901 movw r24,r18 650 02f2 8871 andi r24,lo8(24) 651 02f4 9070 andi r25,hi8(24) 652 02f6 892B or r24,r25 653 02f8 D1F4 brne .L26 654 02fa E0E0 ldi r30,lo8(tcpsockets) 655 02fc F0E0 ldi r31,hi8(tcpsockets) 656 .L29: 657 .LBB3: 305:tcp.c **** && (tcp_hdrflags1 & (PSH_FLAG | ACK_FLAG)) == 0) 306:tcp.c **** { 307:tcp.c **** //Speichern des Socket 308:tcp.c **** for (unsigned char a=0;aStore == 0) 663 .LM55: 664 0306 8081 ld r24,Z 665 0308 9181 ldd r25,Z+1 666 030a 892B or r24,r25 667 030c 61F0 breq .L47 313:tcp.c **** { 314:tcp.c **** tcp_socket->Store = tcp_srcport; 315:tcp.c **** tcp_socket->Status = TCP_SOCKET_NOT_USE; 316:tcp.c **** break; 669 .LM56: 670 030e 3596 adiw r30,5 672 .LM57: 673 0310 80E0 ldi r24,hi8(tcpsockets+35) 674 0312 E030 cpi r30,lo8(tcpsockets+35) 675 0314 F807 cpc r31,r24 676 0316 99F7 brne .L29 677 .L32: 678 .LBE3: 317:tcp.c **** } 318:tcp.c **** } 319:tcp.c **** //Speichert Sequenzcounter und Aknowledgecounter 320:tcp.c **** tcp_store(buffer); 680 .LM58: 681 0318 CE01 movw r24,r28 682 031a 72DE rcall tcp_store 321:tcp.c **** //Setzen des Ack Flag 322:tcp.c **** buffer[TCP_HDRFLAGS+1] |= ACK_FLAG; 684 .LM59: 685 031c F801 movw r30,r16 686 031e 8081 ld r24,Z 687 0320 8061 ori r24,lo8(16) 688 0322 8083 st Z,r24 689 0324 4AC0 rjmp .L54 690 .L47: 691 .LBB4: 693 .LM60: 694 0326 5183 std Z+1,r21 695 0328 4083 st Z,r20 697 .LM61: 698 032a 1482 std Z+4,__zero_reg__ 699 032c F5CF rjmp .L32 700 .L26: 701 .LBE4: 323:tcp.c **** //Erzeugt ein TCP buffer 324:tcp.c **** tcp_make(buffer); 325:tcp.c **** //Sendet das erzeugte TCP buffer 326:tcp.c **** Write_Ethernet_Frame (buffer,*bufferlen); 327:tcp.c **** return(1); 328:tcp.c **** } 329:tcp.c **** 330:tcp.c **** if ((tcp_hdrflags1 & RST_FLAG) > 0) 703 .LM62: 704 032e 22FF sbrs r18,2 705 0330 11C0 rjmp .L34 706 0332 E0E0 ldi r30,lo8(tcpsockets) 707 0334 F0E0 ldi r31,hi8(tcpsockets) 708 .L36: 709 .LBB5: 331:tcp.c **** { 332:tcp.c **** for (unsigned char a=0;aStore == tcp_srcport) 715 .LM64: 716 033e 8081 ld r24,Z 717 0340 9181 ldd r25,Z+1 718 0342 8417 cp r24,r20 719 0344 9507 cpc r25,r21 720 0346 59F0 breq .L48 336:tcp.c **** { 337:tcp.c **** tcp_socket->Store = 0; 338:tcp.c **** break; 722 .LM65: 723 0348 3596 adiw r30,5 725 .LM66: 726 034a 80E0 ldi r24,hi8(tcpsockets+35) 727 034c E030 cpi r30,lo8(tcpsockets+35) 728 034e F807 cpc r31,r24 729 0350 91F7 brne .L36 730 0352 3AC0 rjmp .L55 731 .L34: 732 .LBE5: 339:tcp.c **** } 340:tcp.c **** } 341:tcp.c **** return(1); 342:tcp.c **** } 343:tcp.c **** 344:tcp.c **** if ((tcp_hdrflags1 & FIN_FLAG) > 0) 734 .LM67: 735 0354 20FD sbrc r18,0 736 0356 09C0 rjmp .L40 737 0358 80E0 ldi r24,lo8(0) 738 035a 90E0 ldi r25,hi8(0) 739 035c 37C0 rjmp .L33 740 .L48: 741 .LBB6: 743 .LM68: 744 035e 1182 std Z+1,__zero_reg__ 745 0360 1082 st Z,__zero_reg__ 746 0362 32C0 rjmp .L55 747 .L49: 748 .LBE6: 749 .LBB7: 345:tcp.c **** { 346:tcp.c **** for (unsigned char a=0;aStore == tcp_srcport) 351:tcp.c **** { 352:tcp.c **** tcp_socket->Store = 0; 751 .LM69: 752 0364 1182 std Z+1,__zero_reg__ 753 0366 1082 st Z,__zero_reg__ 754 0368 10C0 rjmp .L45 755 .L40: 756 .LBE7: 758 .LM70: 759 036a E0E0 ldi r30,lo8(tcpsockets) 760 036c F0E0 ldi r31,hi8(tcpsockets) 761 .L42: 762 .LBB8: 764 .LM71: 765 036e F093 0000 sts (tcp_socket)+1,r31 766 0372 E093 0000 sts tcp_socket,r30 768 .LM72: 769 0376 8081 ld r24,Z 770 0378 9181 ldd r25,Z+1 771 037a 8417 cp r24,r20 772 037c 9507 cpc r25,r21 773 037e 91F3 breq .L49 353:tcp.c **** break; 775 .LM73: 776 0380 3596 adiw r30,5 778 .LM74: 779 0382 80E0 ldi r24,hi8(tcpsockets+35) 780 0384 E030 cpi r30,lo8(tcpsockets+35) 781 0386 F807 cpc r31,r24 782 0388 91F7 brne .L42 783 .L45: 784 .LBE8: 354:tcp.c **** } 355:tcp.c **** } 356:tcp.c **** //Setzen des Ack Flag 357:tcp.c **** buffer[TCP_HDRFLAGS+1] = RST_FLAG; 786 .LM75: 787 038a 84E0 ldi r24,lo8(4) 788 038c F801 movw r30,r16 789 038e 8083 st Z,r24 358:tcp.c **** //Speichert Sequenzcounter und Aknowledgecounter 359:tcp.c **** tcp_store(buffer); 791 .LM76: 792 0390 CE01 movw r24,r28 793 0392 36DE rcall tcp_store 360:tcp.c **** //Seq_counter um 1 erh�en 361:tcp.c **** Seq_counter = Seq_counter + 1; 795 .LM77: 796 0394 8091 0000 lds r24,Seq_counter 797 0398 9091 0000 lds r25,(Seq_counter)+1 798 039c A091 0000 lds r26,(Seq_counter)+2 799 03a0 B091 0000 lds r27,(Seq_counter)+3 800 03a4 0196 adiw r24,1 801 03a6 A11D adc r26,__zero_reg__ 802 03a8 B11D adc r27,__zero_reg__ 803 03aa 8093 0000 sts Seq_counter,r24 804 03ae 9093 0000 sts (Seq_counter)+1,r25 805 03b2 A093 0000 sts (Seq_counter)+2,r26 806 03b6 B093 0000 sts (Seq_counter)+3,r27 807 .L54: 362:tcp.c **** //Erzeugt ein TCP buffer 363:tcp.c **** tcp_make(buffer); 809 .LM78: 810 03ba CE01 movw r24,r28 811 03bc 08DF rcall tcp_make 364:tcp.c **** //Sendet das erzeugte TCP buffer 365:tcp.c **** Write_Ethernet_Frame (buffer,*bufferlen); 813 .LM79: 814 03be F701 movw r30,r14 815 03c0 6081 ld r22,Z 816 03c2 7181 ldd r23,Z+1 817 03c4 CE01 movw r24,r28 818 03c6 00D0 rcall Write_Ethernet_Frame 819 .L55: 820 03c8 81E0 ldi r24,lo8(1) 821 03ca 90E0 ldi r25,hi8(1) 822 .L33: 823 /* epilogue: frame size=0 */ 824 03cc DF91 pop r29 825 03ce CF91 pop r28 826 03d0 1F91 pop r17 827 03d2 0F91 pop r16 828 03d4 FF90 pop r15 829 03d6 EF90 pop r14 830 03d8 0895 ret 831 /* epilogue end (size=7) */ 832 /* function TCP_OPEN size 140 (127) */ 837 .Lscope4: 839 .stabd 78,0,0 843 .global TCP_PORT_CLOSE 845 TCP_PORT_CLOSE: 846 .stabd 46,0,0 848 .LM80: 849 /* prologue: frame size=0 */ 850 03da EF92 push r14 851 03dc FF92 push r15 852 03de 0F93 push r16 853 03e0 1F93 push r17 854 /* prologue end (size=4) */ 855 03e2 8C01 movw r16,r24 856 03e4 7B01 movw r14,r22 858 .LM81: 859 03e6 0CDE rcall tcp_store 861 .LM82: 862 03e8 89E1 ldi r24,lo8(25) 863 03ea F801 movw r30,r16 864 03ec 87A7 std Z+47,r24 866 .LM83: 867 03ee C801 movw r24,r16 868 03f0 EEDE rcall tcp_make 870 .LM84: 871 03f2 F701 movw r30,r14 872 03f4 6081 ld r22,Z 873 03f6 7181 ldd r23,Z+1 874 03f8 C801 movw r24,r16 875 03fa 00D0 rcall Write_Ethernet_Frame 876 /* epilogue: frame size=0 */ 877 03fc 1F91 pop r17 878 03fe 0F91 pop r16 879 0400 FF90 pop r15 880 0402 EF90 pop r14 881 0404 0895 ret 882 /* epilogue end (size=5) */ 883 /* function TCP_PORT_CLOSE size 22 (13) */ 885 .Lscope5: 887 .stabd 78,0,0 892 .global TCP_Stack 894 TCP_Stack: 895 .stabd 46,0,0 366:tcp.c **** return(1); 367:tcp.c **** } 368:tcp.c **** return(0); 369:tcp.c **** } 370:tcp.c **** 371:tcp.c **** //############################################################################ 372:tcp.c **** //Verwaltet TCP Stack 373:tcp.c **** char TCP_Stack (char *buffer,int *bufferlen,unsigned char *Stackpointer) 374:tcp.c **** //############################################################################ 375:tcp.c **** { 897 .LM85: 898 /* prologue: frame size=0 */ 899 0406 CF92 push r12 900 0408 DF92 push r13 901 040a FF92 push r15 902 040c 0F93 push r16 903 040e 1F93 push r17 904 0410 CF93 push r28 905 0412 DF93 push r29 906 /* prologue end (size=7) */ 907 0414 EC01 movw r28,r24 908 0416 6B01 movw r12,r22 909 0418 8A01 movw r16,r20 376:tcp.c **** //ist fr Verbindungsaufbau zust�dig TCP SYNC 377:tcp.c **** if (TCP_OPEN(buffer,bufferlen)==1) 911 .LM86: 912 041a 53DF rcall TCP_OPEN 913 041c 0197 sbiw r24,1 914 041e 09F4 brne .+2 915 0420 45C0 rjmp .L59 378:tcp.c **** { 379:tcp.c **** return(1);//keine Daten fr Anwendung 380:tcp.c **** } 381:tcp.c **** 382:tcp.c **** unsigned int TCP_Socket = (buffer[TCP_SRCPORT]<<8) + buffer[TCP_SRCPORT+1]; 917 .LM87: 918 0422 8AA1 ldd r24,Y+34 919 0424 9927 clr r25 920 0426 382F mov r19,r24 921 0428 2227 clr r18 922 042a 8BA1 ldd r24,Y+35 923 042c 280F add r18,r24 924 042e 311D adc r19,__zero_reg__ 925 0430 60E0 ldi r22,lo8(0) 926 0432 70E0 ldi r23,hi8(0) 927 0434 E0E0 ldi r30,lo8(tcpsockets) 928 0436 F0E0 ldi r31,hi8(tcpsockets) 929 .L61: 930 0438 F62E mov r15,r22 931 .LBB9: 383:tcp.c **** 384:tcp.c **** for (unsigned char a=0;aStore) 937 .LM89: 938 0442 8081 ld r24,Z 939 0444 9181 ldd r25,Z+1 940 0446 2817 cp r18,r24 941 0448 3907 cpc r19,r25 942 044a 51F5 brne .L62 389:tcp.c **** { 390:tcp.c **** if ((buffer[TCP_HDRFLAGS+1]&PSH_FLAG) > 0 944 .LM90: 945 044c 8FA5 ldd r24,Y+47 946 044e 482F mov r20,r24 947 0450 5527 clr r21 948 0452 43FF sbrs r20,3 949 0454 07C0 rjmp .L64 950 0456 8481 ldd r24,Z+4 951 0458 8150 subi r24,lo8(-(-1)) 952 045a 8230 cpi r24,lo8(2) 953 045c 18F4 brsh .L64 391:tcp.c **** && (tcp_socket->Status == TCP_SOCKET_OPEN1 || tcp_socket->Status == TCP_SOCKET_OPEN2)) 392:tcp.c **** { 393:tcp.c **** *Stackpointer = a; 955 .LM91: 956 045e F801 movw r30,r16 957 0460 6083 st Z,r22 958 0462 16C0 rjmp .L76 959 .L64: 394:tcp.c **** return(0); //Daten fr Anwendung 395:tcp.c **** } 396:tcp.c **** 397:tcp.c **** if (tcp_socket->Status == TCP_SOCKET_CLOSE) 961 .LM92: 962 0464 8481 ldd r24,Z+4 963 0466 8330 cpi r24,lo8(3) 964 0468 69F4 brne .L68 398:tcp.c **** { 399:tcp.c **** tcp_socket->Store = TCP_SOCKET_NOT_USE; 966 .LM93: 967 046a 1182 std Z+1,__zero_reg__ 968 046c 1082 st Z,__zero_reg__ 400:tcp.c **** tcp_socket->Status = 0; //TCP Socket wird im TCP STACK geschlossen 970 .LM94: 971 046e E091 0000 lds r30,tcp_socket 972 0472 F091 0000 lds r31,(tcp_socket)+1 973 0476 1482 std Z+4,__zero_reg__ 401:tcp.c **** // printf("TCP Socket Close Socket:%d Stack:%d\n",TCP_Socket,a); 402:tcp.c **** TCP_PORT_CLOSE (buffer,bufferlen); 975 .LM95: 976 0478 B601 movw r22,r12 977 047a CE01 movw r24,r28 978 047c AEDF rcall TCP_PORT_CLOSE 403:tcp.c **** *Stackpointer = a; 980 .LM96: 981 047e F801 movw r30,r16 982 0480 F082 st Z,r15 983 0482 14C0 rjmp .L59 984 .L68: 404:tcp.c **** return(1); //Keine Daten fr Anwendung 405:tcp.c **** } 406:tcp.c **** 407:tcp.c **** if (tcp_socket->Status == TCP_SOCKET_NOT_USE) 986 .LM97: 987 0484 8823 tst r24 988 0486 39F4 brne .L70 408:tcp.c **** { 409:tcp.c **** // printf("TCP Socket Open Socket:%d Stack:%d\n",TCP_Socket,a); 410:tcp.c **** tcp_socket->Status = TCP_SOCKET_OPEN1; //TCP Socket wird im TCP Stack ge�fnet 990 .LM98: 991 0488 81E0 ldi r24,lo8(1) 992 048a 8483 std Z+4,r24 993 .L77: 411:tcp.c **** *Stackpointer = a; 995 .LM99: 996 048c F801 movw r30,r16 997 048e F082 st Z,r15 998 .L76: 999 0490 80E0 ldi r24,lo8(0) 1000 0492 90E0 ldi r25,hi8(0) 1001 0494 0DC0 rjmp .L67 1002 .L70: 412:tcp.c **** return(0); //ACK fr Anwendung 413:tcp.c **** } 414:tcp.c **** 415:tcp.c **** if ((buffer[TCP_HDRFLAGS+1]&ACK_FLAG) > 0 1004 .LM100: 1005 0496 44FF sbrs r20,4 1006 0498 03C0 rjmp .L62 1007 049a 8150 subi r24,lo8(-(-1)) 1008 049c 8230 cpi r24,lo8(2) 1009 049e B0F3 brlo .L77 1010 .L62: 416:tcp.c **** && (tcp_socket->Status == TCP_SOCKET_OPEN1 || tcp_socket->Status == TCP_SOCKET_OPEN2)) 417:tcp.c **** { 418:tcp.c **** *Stackpointer = a; 419:tcp.c **** return(0); //ACK fr Anwendung 1012 .LM101: 1013 04a0 6F5F subi r22,lo8(-(1)) 1014 04a2 7F4F sbci r23,hi8(-(1)) 1015 04a4 3596 adiw r30,5 1017 .LM102: 1018 04a6 6730 cpi r22,7 1019 04a8 7105 cpc r23,__zero_reg__ 1020 04aa 31F6 brne .L61 1021 .L59: 1022 04ac 81E0 ldi r24,lo8(1) 1023 04ae 90E0 ldi r25,hi8(1) 1024 .L67: 1025 .LBE9: 1026 /* epilogue: frame size=0 */ 1027 04b0 DF91 pop r29 1028 04b2 CF91 pop r28 1029 04b4 1F91 pop r17 1030 04b6 0F91 pop r16 1031 04b8 FF90 pop r15 1032 04ba DF90 pop r13 1033 04bc CF90 pop r12 1034 04be 0895 ret 1035 /* epilogue end (size=8) */ 1036 /* function TCP_Stack size 94 (79) */ 1044 .Lscope6: 1046 .stabd 78,0,0 1047 .data 1048 .LC0: 1049 0000 6F66 6600 .string "off" 1050 0004 00 .string "" 1051 .LC1: 1052 0005 6F6E 00 .string "on" 1053 0008 00 .string "" 1054 .text 1058 .global PinOnOff 1060 PinOnOff: 1061 .stabd 46,0,0 1063 .LM103: 1064 /* prologue: frame size=0 */ 1065 /* prologue end (size=0) */ 1066 04c0 FC01 movw r30,r24 1068 .LM104: 1069 04c2 83B3 in r24,51-0x20 1070 04c4 8623 and r24,r22 1071 04c6 41F0 breq .L79 1073 .LM105: 1074 04c8 A0E0 ldi r26,lo8(.LC0) 1075 04ca B0E0 ldi r27,hi8(.LC0) 1076 04cc 83E0 ldi r24,lo8(3) 1077 .L81: 1078 04ce 0D90 ld r0,X+ 1079 04d0 0192 st Z+,r0 1080 04d2 8150 subi r24,lo8(-(-1)) 1081 04d4 69F0 breq .L83 1082 04d6 FBCF rjmp .L81 1083 .L79: 1085 .LM106: 1086 04d8 8091 0000 lds r24,.LC1 1087 04dc 9091 0000 lds r25,(.LC1)+1 1088 04e0 A091 0000 lds r26,(.LC1)+2 1089 04e4 B091 0000 lds r27,(.LC1)+3 1090 04e8 8083 st Z,r24 1091 04ea 9183 std Z+1,r25 1092 04ec A283 std Z+2,r26 1093 04ee B383 std Z+3,r27 1094 .L83: 1095 04f0 0895 ret 1096 /* epilogue: frame size=0 */ 1097 /* epilogue: noreturn */ 1098 /* epilogue end (size=0) */ 1099 /* function PinOnOff size 27 (27) */ 1101 .Lscope7: 1103 .stabd 78,0,0 1107 .global PortOnOff 1109 PortOnOff: 1110 .stabd 46,0,0 1112 .LM107: 1113 /* prologue: frame size=0 */ 1114 /* prologue end (size=0) */ 1115 04f2 FC01 movw r30,r24 1117 .LM108: 1118 04f4 82B3 in r24,50-0x20 1119 04f6 8623 and r24,r22 1120 04f8 41F0 breq .L86 1122 .LM109: 1123 04fa A0E0 ldi r26,lo8(.LC1) 1124 04fc B0E0 ldi r27,hi8(.LC1) 1125 04fe 83E0 ldi r24,lo8(3) 1126 .L88: 1127 0500 0D90 ld r0,X+ 1128 0502 0192 st Z+,r0 1129 0504 8150 subi r24,lo8(-(-1)) 1130 0506 49F0 breq .L90 1131 0508 FBCF rjmp .L88 1132 .L86: 1134 .LM110: 1135 050a 8FE6 ldi r24,lo8(6710895) 1136 050c 96E6 ldi r25,hi8(6710895) 1137 050e A6E6 ldi r26,hlo8(6710895) 1138 0510 B0E0 ldi r27,hhi8(6710895) 1139 0512 8083 st Z,r24 1140 0514 9183 std Z+1,r25 1141 0516 A283 std Z+2,r26 1142 0518 B383 std Z+3,r27 1143 .L90: 1144 051a 0895 ret 1145 /* epilogue: frame size=0 */ 1146 /* epilogue: noreturn */ 1147 /* epilogue end (size=0) */ 1148 /* function PortOnOff size 23 (23) */ 1150 .Lscope8: 1152 .stabd 78,0,0 1153 .data 1154 .LC3: 1155 0009 5245 4C00 .string "REL" 1156 .LC4: 1157 000d 4F55 5400 .string "OUT" 1158 .LC5: 1159 0011 494E 5000 .string "INP" 1160 .LC6: 1161 0015 454E 4400 .string "END" 1162 .LC2: 1163 0019 00 .string "" 1164 001a 00 .string "" 1165 001b 00 .string "" 1166 001c 00 .string "" 1167 001d 00 .string "" 1168 .text 1173 .global tcp_add_data 1175 tcp_add_data: 1176 .stabd 46,0,0 1178 .LM111: 1179 /* prologue: frame size=4 */ 1180 051c 6F92 push r6 1181 051e 7F92 push r7 1182 0520 8F92 push r8 1183 0522 9F92 push r9 1184 0524 AF92 push r10 1185 0526 BF92 push r11 1186 0528 CF92 push r12 1187 052a DF92 push r13 1188 052c EF92 push r14 1189 052e FF92 push r15 1190 0530 0F93 push r16 1191 0532 1F93 push r17 1192 0534 CF93 push r28 1193 0536 DF93 push r29 1194 0538 CDB7 in r28,__SP_L__ 1195 053a DEB7 in r29,__SP_H__ 1196 053c 2497 sbiw r28,4 1197 053e 0FB6 in __tmp_reg__,__SREG__ 1198 0540 F894 cli 1199 0542 DEBF out __SP_H__,r29 1200 0544 0FBE out __SREG__,__tmp_reg__ 1201 0546 CDBF out __SP_L__,r28 1202 /* prologue end (size=22) */ 1203 0548 8C01 movw r16,r24 1204 054a 5B01 movw r10,r22 1205 054c 3A01 movw r6,r20 1207 .LM112: 1208 054e FB01 movw r30,r22 1209 0550 86A5 ldd r24,Z+46 1210 0552 E82E mov r14,r24 1211 0554 FF24 clr r15 1212 0556 F0EF ldi r31,lo8(240) 1213 0558 EF22 and r14,r31 1214 055a FF24 clr r15 1215 055c F594 asr r15 1216 055e E794 ror r14 1217 0560 F594 asr r15 1218 0562 E794 ror r14 1219 0564 F501 movw r30,r10 1220 0566 8685 ldd r24,Z+14 1221 0568 9927 clr r25 1222 056a 8F70 andi r24,lo8(15) 1223 056c 9070 andi r25,hi8(15) 1224 056e 880F lsl r24 1225 0570 991F rol r25 1226 0572 880F lsl r24 1227 0574 991F rol r25 1228 0576 0E96 adiw r24,14 1229 0578 E80E add r14,r24 1230 057a F91E adc r15,r25 1231 057c 01C0 rjmp .L93 1232 .L94: 1234 .LM113: 1235 057e 7601 movw r14,r12 1236 .L93: 1237 .LBB10: 1239 .LM114: 1240 0580 F801 movw r30,r16 1241 0582 0F5F subi r16,lo8(-(1)) 1242 0584 1F4F sbci r17,hi8(-(1)) 1243 /* #APP */ 1244 0586 E491 lpm r30, Z 1245 1246 /* #NOAPP */ 1247 .LBE10: 1249 .LM115: 1250 0588 4501 movw r8,r10 1251 058a 8E0C add r8,r14 1252 058c 9F1C adc r9,r15 1253 058e D401 movw r26,r8 1254 0590 EC93 st X,r30 1256 .LM116: 1257 0592 6701 movw r12,r14 1258 0594 0894 sec 1259 0596 C11C adc r12,__zero_reg__ 1260 0598 D11C adc r13,__zero_reg__ 1262 .LM117: 1263 059a B4EF ldi r27,lo8(500) 1264 059c CB16 cp r12,r27 1265 059e B1E0 ldi r27,hi8(500) 1266 05a0 DB06 cpc r13,r27 1267 05a2 30F0 brlo .L95 1269 .LM118: 1270 05a4 1093 0000 sts (pointerold)+1,r17 1271 05a8 0093 0000 sts pointerold,r16 1272 05ac 11E0 ldi r17,lo8(1) 1273 05ae 67C0 rjmp .L97 1274 .L95: 1275 .LBB11: 1277 .LM119: 1278 05b0 F801 movw r30,r16 1279 /* #APP */ 1280 05b2 8491 lpm r24, Z 1281 1282 /* #NOAPP */ 1283 .LBE11: 1284 05b4 8532 cpi r24,lo8(37) 1285 05b6 19F7 brne .L94 1286 .LBB12: 1288 .LM120: 1289 05b8 8091 0000 lds r24,.LC2 1290 05bc 9091 0000 lds r25,(.LC2)+1 1291 05c0 A091 0000 lds r26,(.LC2)+2 1292 05c4 B091 0000 lds r27,(.LC2)+3 1293 05c8 8983 std Y+1,r24 1294 05ca 9A83 std Y+2,r25 1295 05cc AB83 std Y+3,r26 1296 05ce BC83 std Y+4,r27 1298 .LM121: 1299 05d0 B801 movw r22,r16 1300 05d2 6F5F subi r22,lo8(-(1)) 1301 05d4 7F4F sbci r23,hi8(-(1)) 1302 05d6 43E0 ldi r20,lo8(3) 1303 05d8 50E0 ldi r21,hi8(3) 1304 05da 80E0 ldi r24,lo8(.LC3) 1305 05dc 90E0 ldi r25,hi8(.LC3) 1306 05de 00D0 rcall strncmp_P 1307 05e0 892B or r24,r25 1308 05e2 31F4 brne .L99 1310 .LM122: 1311 05e4 0C5F subi r16,lo8(-(4)) 1312 05e6 1F4F sbci r17,hi8(-(4)) 1314 .LM123: 1315 05e8 60E1 ldi r22,lo8(16) 1316 05ea CE01 movw r24,r28 1317 05ec 0196 adiw r24,1 1318 05ee 81DF rcall PortOnOff 1319 .L99: 1321 .LM124: 1322 05f0 B801 movw r22,r16 1323 05f2 6F5F subi r22,lo8(-(1)) 1324 05f4 7F4F sbci r23,hi8(-(1)) 1325 05f6 43E0 ldi r20,lo8(3) 1326 05f8 50E0 ldi r21,hi8(3) 1327 05fa 80E0 ldi r24,lo8(.LC4) 1328 05fc 90E0 ldi r25,hi8(.LC4) 1329 05fe 00D0 rcall strncmp_P 1330 0600 892B or r24,r25 1331 0602 31F4 brne .L101 1333 .LM125: 1334 0604 0C5F subi r16,lo8(-(4)) 1335 0606 1F4F sbci r17,hi8(-(4)) 1337 .LM126: 1338 0608 68E0 ldi r22,lo8(8) 1339 060a CE01 movw r24,r28 1340 060c 0196 adiw r24,1 1341 060e 71DF rcall PortOnOff 1342 .L101: 1344 .LM127: 1345 0610 B801 movw r22,r16 1346 0612 6F5F subi r22,lo8(-(1)) 1347 0614 7F4F sbci r23,hi8(-(1)) 1348 0616 43E0 ldi r20,lo8(3) 1349 0618 50E0 ldi r21,hi8(3) 1350 061a 80E0 ldi r24,lo8(.LC5) 1351 061c 90E0 ldi r25,hi8(.LC5) 1352 061e 00D0 rcall strncmp_P 1353 0620 892B or r24,r25 1354 0622 31F4 brne .L103 1356 .LM128: 1357 0624 0C5F subi r16,lo8(-(4)) 1358 0626 1F4F sbci r17,hi8(-(4)) 1360 .LM129: 1361 0628 60E2 ldi r22,lo8(32) 1362 062a CE01 movw r24,r28 1363 062c 0196 adiw r24,1 1364 062e 48DF rcall PinOnOff 1365 .L103: 1366 0630 D401 movw r26,r8 1367 0632 40E0 ldi r20,lo8(0) 1368 0634 50E0 ldi r21,hi8(0) 1369 0636 CE01 movw r24,r28 1370 0638 0196 adiw r24,1 1371 063a 01C0 rjmp .L105 1372 .L106: 1374 .LM130: 1375 063c EC93 st X,r30 1376 .L105: 1378 .LM131: 1379 063e FC01 movw r30,r24 1380 0640 E40F add r30,r20 1381 0642 F11D adc r31,__zero_reg__ 1382 0644 E081 ld r30,Z 1383 0646 4F5F subi r20,lo8(-(1)) 1384 0648 5F4F sbci r21,hi8(-(1)) 1385 064a 1196 adiw r26,1 1386 064c EE23 tst r30 1387 064e B1F7 brne .L106 1388 0650 6701 movw r12,r14 1389 0652 C40E add r12,r20 1390 0654 D51E adc r13,r21 1392 .LM132: 1393 0656 B801 movw r22,r16 1394 0658 6F5F subi r22,lo8(-(1)) 1395 065a 7F4F sbci r23,hi8(-(1)) 1396 065c 43E0 ldi r20,lo8(3) 1397 065e 50E0 ldi r21,hi8(3) 1398 0660 80E0 ldi r24,lo8(.LC6) 1399 0662 90E0 ldi r25,hi8(.LC6) 1400 0664 00D0 rcall strncmp_P 1401 0666 892B or r24,r25 1402 0668 09F0 breq .+2 1403 066a 89CF rjmp .L94 1404 066c 80E0 ldi r24,lo8(0) 1405 066e 90E0 ldi r25,hi8(0) 1406 .L109: 1407 .LBB13: 1409 .LM133: 1410 /* #APP */ 1411 0670 0000 nop 1412 /* #NOAPP */ 1413 0672 0196 adiw r24,1 1414 0674 F3E0 ldi r31,hi8(1000) 1415 0676 883E cpi r24,lo8(1000) 1416 0678 9F07 cpc r25,r31 1417 067a D1F7 brne .L109 1418 067c 10E0 ldi r17,lo8(0) 1419 .L97: 1420 .LBE13: 1421 .LBE12: 1423 .LM134: 1424 067e A601 movw r20,r12 1425 0680 B301 movw r22,r6 1426 0682 C501 movw r24,r10 1427 0684 59DD rcall TCP_New_Packtlen 1429 .LM135: 1430 0686 812F mov r24,r17 1431 0688 9927 clr r25 1432 /* epilogue: frame size=4 */ 1433 068a 2496 adiw r28,4 1434 068c 0FB6 in __tmp_reg__,__SREG__ 1435 068e F894 cli 1436 0690 DEBF out __SP_H__,r29 1437 0692 0FBE out __SREG__,__tmp_reg__ 1438 0694 CDBF out __SP_L__,r28 1439 0696 DF91 pop r29 1440 0698 CF91 pop r28 1441 069a 1F91 pop r17 1442 069c 0F91 pop r16 1443 069e FF90 pop r15 1444 06a0 EF90 pop r14 1445 06a2 DF90 pop r13 1446 06a4 CF90 pop r12 1447 06a6 BF90 pop r11 1448 06a8 AF90 pop r10 1449 06aa 9F90 pop r9 1450 06ac 8F90 pop r8 1451 06ae 7F90 pop r7 1452 06b0 6F90 pop r6 1453 06b2 0895 ret 1454 /* epilogue end (size=21) */ 1455 /* function tcp_add_data size 211 (168) */ 1474 .Lscope9: 1476 .stabd 78,0,0 1477 .global sitecounter 1478 .global sitecounter 1479 .section .bss 1482 sitecounter: 1483 0000 0000 .skip 2,0 1484 .global password 1485 .global password 1488 password: 1489 0002 0000 0000 .skip 16,0 1489 0000 0000 1489 0000 0000 1489 0000 0000 1490 .comm tcpsockets,35,1 1491 .comm tcp_socket,2,1 1492 .comm pointerold,2,1 1493 .comm Seq_counter,4,1 1494 .comm Ack_counter,4,1 1502 .text 1504 .Letext0: 1505 /* File "tcp.c": code 871 = 0x0367 ( 765), prologues 50, epilogues 56 */ DEFINED SYMBOLS *ABS*:00000000 tcp.c /tmp/ccEuEV45.s:3 *ABS*:0000003f __SREG__ /tmp/ccEuEV45.s:4 *ABS*:0000003e __SP_H__ /tmp/ccEuEV45.s:5 *ABS*:0000003d __SP_L__ /tmp/ccEuEV45.s:6 *ABS*:00000000 __tmp_reg__ /tmp/ccEuEV45.s:7 *ABS*:00000001 __zero_reg__ /tmp/ccEuEV45.s:117 .text:00000000 tcp_store *COM*:00000004 Seq_counter *COM*:00000004 Ack_counter /tmp/ccEuEV45.s:296 .text:00000138 TCP_New_Packtlen /tmp/ccEuEV45.s:339 .text:00000154 tcp_add_datastring /tmp/ccEuEV45.s:450 .text:000001ce tcp_make /tmp/ccEuEV45.s:612 .text:000002c2 TCP_OPEN *COM*:00000023 tcpsockets *COM*:00000002 tcp_socket /tmp/ccEuEV45.s:845 .text:000003da TCP_PORT_CLOSE /tmp/ccEuEV45.s:894 .text:00000406 TCP_Stack /tmp/ccEuEV45.s:1060 .text:000004c0 PinOnOff /tmp/ccEuEV45.s:1109 .text:000004f2 PortOnOff /tmp/ccEuEV45.s:1175 .text:0000051c tcp_add_data *COM*:00000002 pointerold /tmp/ccEuEV45.s:1482 .bss:00000000 sitecounter /tmp/ccEuEV45.s:1488 .bss:00000002 password UNDEFINED SYMBOLS __do_copy_data __do_clear_bss Make_IP_Header checksum Write_Ethernet_Frame strncmp_P