📄 main.lss
字号:
//softuart_puts_progmem("RX\n");
//packet type
type = (buffer[12]<<8) + buffer[13];
21ee: d0 91 88 00 lds r29, 0x0088
21f2: c0 e0 ldi r28, 0x00 ; 0
21f4: 80 91 89 00 lds r24, 0x0089
21f8: 9e 01 movw r18, r28
21fa: 28 0f add r18, r24
21fc: 31 1d adc r19, r1
21fe: c9 01 movw r24, r18
if(type == ETHERNET_TYPE_ARP){
2200: 38 e0 ldi r19, 0x08 ; 8
2202: 86 30 cpi r24, 0x06 ; 6
2204: 93 07 cpc r25, r19
2206: 29 f4 brne .+10 ; 0x2212 <main+0x98>
///ARP packet
arp_packet_in(buffer,len);
2208: 8c e7 ldi r24, 0x7C ; 124
220a: 90 e0 ldi r25, 0x00 ; 0
220c: 0e 94 c4 12 call 0x2588 ; 0x2588 <arp_packet_in>
2210: 1e c0 rjmp .+60 ; 0x224e <main+0xd4>
//check if we have to call ntp_client:
}else if (type == ETHERNET_TYPE_IP){
2212: 80 50 subi r24, 0x00 ; 0
2214: 98 40 sbci r25, 0x08 ; 8
2216: d9 f4 brne .+54 ; 0x224e <main+0xd4>
///IP packet
//ip protocol:
unsigned char ip_protocol = buffer[IP_POS_IPTYPE];
2218: 10 91 93 00 lds r17, 0x0093
switch (ip_protocol){
221c: 16 30 cpi r17, 0x06 ; 6
221e: 49 f0 breq .+18 ; 0x2232 <main+0xb8>
2220: 11 31 cpi r17, 0x11 ; 17
2222: a9 f0 breq .+42 ; 0x224e <main+0xd4>
2224: 11 30 cpi r17, 0x01 ; 1
2226: 51 f4 brne .+20 ; 0x223c <main+0xc2>
///icmp packet:
case (IP_PROTOCOL_ICMP):
icmp_packet_in(&buffer[0],len);
2228: 8c e7 ldi r24, 0x7C ; 124
222a: 90 e0 ldi r25, 0x00 ; 0
222c: 0e 94 ed 16 call 0x2dda ; 0x2dda <icmp_packet_in>
2230: 0e c0 rjmp .+28 ; 0x224e <main+0xd4>
break;
///tcp packet:
case(IP_PROTOCOL_TCP):
//port = (buffer[TCP_POS_DST_PORT]<<8) + buffer[TCP_POS_DST_PORT+1];
tcp_packet_in(buffer,len);
2232: 8c e7 ldi r24, 0x7C ; 124
2234: 90 e0 ldi r25, 0x00 ; 0
2236: 0e 94 76 1e call 0x3cec ; 0x3cec <tcp_packet_in>
223a: 09 c0 rjmp .+18 ; 0x224e <main+0xd4>
break;
///unknown:
default:
softuart_puts("??? : ip proto ");
223c: 80 e6 ldi r24, 0x60 ; 96
223e: 90 e0 ldi r25, 0x00 ; 0
2240: 0e 94 e9 17 call 0x2fd2 ; 0x2fd2 <softuart_puts>
softuart_put_uint8(ip_protocol);
2244: 81 2f mov r24, r17
2246: 0e 94 0b 18 call 0x3016 ; 0x3016 <softuart_put_uint8>
softuart_putnewline();
224a: 0e 94 06 18 call 0x300c ; 0x300c <softuart_putnewline>
}
}
//calc new time:
clock_do();
224e: 0e 94 91 17 call 0x2f22 ; 0x2f22 <clock_do>
//every new second:
if (CLOCK_TEST_FLAG(CLOCK_SEC)){
2252: 80 91 a4 04 lds r24, 0x04A4
2256: 82 ff sbrs r24, 2
2258: c0 cf rjmp .-128 ; 0x21da <main+0x60>
if (clock[CLOCK_SEC]&0x01)
225a: 80 91 a8 04 lds r24, 0x04A8
225e: 80 ff sbrs r24, 0
2260: 02 c0 rjmp .+4 ; 0x2266 <main+0xec>
LED_STATUS_ON();
2262: ab 9a sbi 0x15, 3 ; 21
2264: 01 c0 rjmp .+2 ; 0x2268 <main+0xee>
else
LED_STATUS_OFF();
2266: ab 98 cbi 0x15, 3 ; 21
//call tcp cleanup:
tcp_ttl_cleanup();
2268: 0e 94 1b 1e call 0x3c36 ; 0x3c36 <tcp_ttl_cleanup>
//call mca25 cleanup:
mca25_cleanup();
226c: 0e 94 20 38 call 0x7040 ; 0x7040 <mca25_cleanup>
//call templogger:
logger_do();
2270: 0e 94 94 37 call 0x6f28 ; 0x6f28 <logger_do>
//clear flag:
CLOCK_CLEAR_FLAG(CLOCK_SEC);
2274: 80 91 a4 04 lds r24, 0x04A4
2278: 8b 7f andi r24, 0xFB ; 251
227a: 80 93 a4 04 sts 0x04A4, r24
227e: ad cf rjmp .-166 ; 0x21da <main+0x60>
00002280 <ip_generate_packet>:
void ip_generate_packet(unsigned char *buffer,
uint32_t *dest_ip,
unsigned char *dest_mac,
unsigned int source_port, unsigned int dest_port,
unsigned char ip_packettype,
unsigned int data_length){
2280: cf 92 push r12
2282: df 92 push r13
2284: ef 92 push r14
2286: 0f 93 push r16
2288: 1f 93 push r17
228a: cf 93 push r28
228c: df 93 push r29
228e: ec 01 movw r28, r24
2290: 8b 01 movw r16, r22
2292: b6 01 movw r22, r12
unsigned int res16;
unsigned int c;
//datalength = datalength + ip header:
data_length = data_length + (IP_HEADER_LENGTH<<2);
2294: 6c 5e subi r22, 0xEC ; 236
2296: 7f 4f sbci r23, 0xFF ; 255
2298: dc 01 movw r26, r24
229a: 20 e0 ldi r18, 0x00 ; 0
229c: 30 e0 ldi r19, 0x00 ; 0
//generate ethernet packet:
for (c=0; c<6; c++){
//set destination mac address:
buffer[c] = dest_mac[c];
229e: fa 01 movw r30, r20
22a0: e2 0f add r30, r18
22a2: f3 1f adc r31, r19
22a4: 80 81 ld r24, Z
22a6: 8c 93 st X, r24
//set source mac address:
buffer[c+6] = nic_mac[c];
22a8: f9 01 movw r30, r18
22aa: ec 56 subi r30, 0x6C ; 108
22ac: fb 4f sbci r31, 0xFB ; 251
22ae: 80 81 ld r24, Z
22b0: 16 96 adiw r26, 0x06 ; 6
22b2: 8c 93 st X, r24
22b4: 16 97 sbiw r26, 0x06 ; 6
//datalength = datalength + ip header:
data_length = data_length + (IP_HEADER_LENGTH<<2);
//generate ethernet packet:
for (c=0; c<6; c++){
22b6: 2f 5f subi r18, 0xFF ; 255
22b8: 3f 4f sbci r19, 0xFF ; 255
22ba: 11 96 adiw r26, 0x01 ; 1
22bc: 26 30 cpi r18, 0x06 ; 6
22be: 31 05 cpc r19, r1
22c0: 71 f7 brne .-36 ; 0x229e <ip_generate_packet+0x1e>
//set source mac address:
buffer[c+6] = nic_mac[c];
}
//set ethernet packettype to IP
buffer[12] = 0x08;
22c2: 88 e0 ldi r24, 0x08 ; 8
22c4: 8c 87 std Y+12, r24 ; 0x0c
buffer[13] = 0x00;
22c6: 1d 86 std Y+13, r1 ; 0x0d
//now generate ip packet:
//set ipv4 & set length:
buffer[IP_POS_VERSION] = IP_V4 | IP_HEADER_LENGTH;
22c8: 85 e4 ldi r24, 0x45 ; 69
22ca: 8e 87 std Y+14, r24 ; 0x0e
//set TOS to default 0x00 (?)
buffer[IP_POS_TOS] = 0x00;
22cc: 1f 86 std Y+15, r1 ; 0x0f
//set total length:
buffer[IP_POS_PKTLEN+0] = (data_length>>8)&0xFF;
22ce: 78 8b std Y+16, r23 ; 0x10
buffer[IP_POS_PKTLEN+1] = (data_length )&0xFF;
22d0: 69 8b std Y+17, r22 ; 0x11
//set packet identification
buffer[IP_POS_IDENTIFICATIION+0] = (ip_identification>>8)&0xFF;
22d2: 80 91 64 04 lds r24, 0x0464
22d6: 90 91 65 04 lds r25, 0x0465
22da: 9a 8b std Y+18, r25 ; 0x12
buffer[IP_POS_IDENTIFICATIION+1] = (ip_identification )&0xFF;
22dc: 80 91 64 04 lds r24, 0x0464
22e0: 90 91 65 04 lds r25, 0x0465
22e4: 8b 8b std Y+19, r24 ; 0x13
ip_identification++;
22e6: 80 91 64 04 lds r24, 0x0464
22ea: 90 91 65 04 lds r25, 0x0465
22ee: 01 96 adiw r24, 0x01 ; 1
22f0: 90 93 65 04 sts 0x0465, r25
22f4: 80 93 64 04 sts 0x0464, r24
//set dont fragment flags:
buffer[IP_POS_FRAGMENTATION_FLAGS+0] = 0x40;
22f8: 80 e4 ldi r24, 0x40 ; 64
22fa: 8c 8b std Y+20, r24 ; 0x14
buffer[IP_POS_FRAGMENTATION_FLAGS+1] = 0x00;
22fc: 1d 8a std Y+21, r1 ; 0x15
//set TTL to 128
buffer[IP_POS_TTL] = 0x80;
22fe: 80 e8 ldi r24, 0x80 ; 128
2300: 8e 8b std Y+22, r24 ; 0x16
//set ip packettype to tcp/udp/...
buffer[IP_POS_IPTYPE] = ip_packettype;
2302: ef 8a std Y+23, r14 ; 0x17
//set dest ip:
nic_ip_to_buffer(&buffer[IP_POS_DST_IP], *dest_ip);
2304: f8 01 movw r30, r16
2306: 40 81 ld r20, Z
2308: 51 81 ldd r21, Z+1 ; 0x01
230a: 62 81 ldd r22, Z+2 ; 0x02
230c: 73 81 ldd r23, Z+3 ; 0x03
230e: ce 01 movw r24, r28
2310: 4e 96 adiw r24, 0x1e ; 30
2312: 0e 94 4c 14 call 0x2898 ; 0x2898 <nic_ip_to_buffer>
//set source ip:
nic_ip_to_buffer(&buffer[IP_POS_SRC_IP], nic_ip);
2316: 40 91 9a 04 lds r20, 0x049A
231a: 50 91 9b 04 lds r21, 0x049B
231e: 60 91 9c 04 lds r22, 0x049C
2322: 70 91 9d 04 lds r23, 0x049D
2326: ce 01 movw r24, r28
2328: 4a 96 adiw r24, 0x1a ; 26
232a: 0e 94 4c 14 call 0x2898 ; 0x2898 <nic_ip_to_buffer>
//set checksum to zero before running crc calc:
buffer[IP_POS_CHECKSUM+0] = 0x00;
232e: 18 8e std Y+24, r1 ; 0x18
buffer[IP_POS_CHECKSUM+1] = 0x00;
2330: 19 8e std Y+25, r1 ; 0x19
buffer[13] = 0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -