mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-19 11:24:42 +00:00
test/cmd/wget: fix the test
Changes: * update to new tcp stack * fix zero values for ISS and IRS issue (see RFC 9293) Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
bf962de97c
commit
fa3ae38b83
2 changed files with 33 additions and 33 deletions
|
@ -77,6 +77,8 @@ typedef int sandbox_eth_tx_hand_f(struct udevice *dev, void *pkt,
|
||||||
* fake_host_hwaddr - MAC address of mocked machine
|
* fake_host_hwaddr - MAC address of mocked machine
|
||||||
* fake_host_ipaddr - IP address of mocked machine
|
* fake_host_ipaddr - IP address of mocked machine
|
||||||
* disabled - Will not respond
|
* disabled - Will not respond
|
||||||
|
* irs - tcp initial receive sequence
|
||||||
|
* iss - tcp initial send sequence
|
||||||
* recv_packet_buffer - buffers of the packet returned as received
|
* recv_packet_buffer - buffers of the packet returned as received
|
||||||
* recv_packet_length - lengths of the packet returned as received
|
* recv_packet_length - lengths of the packet returned as received
|
||||||
* recv_packets - number of packets returned
|
* recv_packets - number of packets returned
|
||||||
|
@ -87,6 +89,8 @@ struct eth_sandbox_priv {
|
||||||
uchar fake_host_hwaddr[ARP_HLEN];
|
uchar fake_host_hwaddr[ARP_HLEN];
|
||||||
struct in_addr fake_host_ipaddr;
|
struct in_addr fake_host_ipaddr;
|
||||||
bool disabled;
|
bool disabled;
|
||||||
|
u32 irs;
|
||||||
|
u32 iss;
|
||||||
uchar * recv_packet_buffer[PKTBUFSRX];
|
uchar * recv_packet_buffer[PKTBUFSRX];
|
||||||
int recv_packet_length[PKTBUFSRX];
|
int recv_packet_length[PKTBUFSRX];
|
||||||
int recv_packets;
|
int recv_packets;
|
||||||
|
|
|
@ -25,8 +25,7 @@
|
||||||
|
|
||||||
#define SHIFT_TO_TCPHDRLEN_FIELD(x) ((x) << 4)
|
#define SHIFT_TO_TCPHDRLEN_FIELD(x) ((x) << 4)
|
||||||
#define LEN_B_TO_DW(x) ((x) >> 2)
|
#define LEN_B_TO_DW(x) ((x) >> 2)
|
||||||
|
#define GET_TCP_HDR_LEN_IN_BYTES(x) ((x) >> 2)
|
||||||
int net_set_ack_options(union tcp_build_pkt *b);
|
|
||||||
|
|
||||||
static int sb_arp_handler(struct udevice *dev, void *packet,
|
static int sb_arp_handler(struct udevice *dev, void *packet,
|
||||||
unsigned int len)
|
unsigned int len)
|
||||||
|
@ -64,12 +63,14 @@ static int sb_syn_handler(struct udevice *dev, void *packet,
|
||||||
eth_send = (void *)priv->recv_packet_buffer[priv->recv_packets];
|
eth_send = (void *)priv->recv_packet_buffer[priv->recv_packets];
|
||||||
memcpy(eth_send->et_dest, eth->et_src, ARP_HLEN);
|
memcpy(eth_send->et_dest, eth->et_src, ARP_HLEN);
|
||||||
memcpy(eth_send->et_src, priv->fake_host_hwaddr, ARP_HLEN);
|
memcpy(eth_send->et_src, priv->fake_host_hwaddr, ARP_HLEN);
|
||||||
|
priv->irs = ntohl(tcp->tcp_seq);
|
||||||
|
priv->iss = ~priv->irs; /* just to differ from irs */
|
||||||
eth_send->et_protlen = htons(PROT_IP);
|
eth_send->et_protlen = htons(PROT_IP);
|
||||||
tcp_send = (void *)eth_send + ETHER_HDR_SIZE;
|
tcp_send = (void *)eth_send + ETHER_HDR_SIZE;
|
||||||
tcp_send->tcp_src = tcp->tcp_dst;
|
tcp_send->tcp_src = tcp->tcp_dst;
|
||||||
tcp_send->tcp_dst = tcp->tcp_src;
|
tcp_send->tcp_dst = tcp->tcp_src;
|
||||||
tcp_send->tcp_seq = htonl(0);
|
tcp_send->tcp_seq = htonl(priv->iss);
|
||||||
tcp_send->tcp_ack = htonl(ntohl(tcp->tcp_seq) + 1);
|
tcp_send->tcp_ack = htonl(priv->irs + 1);
|
||||||
tcp_send->tcp_hlen = SHIFT_TO_TCPHDRLEN_FIELD(LEN_B_TO_DW(TCP_HDR_SIZE));
|
tcp_send->tcp_hlen = SHIFT_TO_TCPHDRLEN_FIELD(LEN_B_TO_DW(TCP_HDR_SIZE));
|
||||||
tcp_send->tcp_flags = TCP_SYN | TCP_ACK;
|
tcp_send->tcp_flags = TCP_SYN | TCP_ACK;
|
||||||
tcp_send->tcp_win = htons(PKTBUFSRX * TCP_MSS >> TCP_SCALE);
|
tcp_send->tcp_win = htons(PKTBUFSRX * TCP_MSS >> TCP_SCALE);
|
||||||
|
@ -104,13 +105,11 @@ static int sb_ack_handler(struct udevice *dev, void *packet,
|
||||||
void *data;
|
void *data;
|
||||||
int pkt_len;
|
int pkt_len;
|
||||||
int payload_len = 0;
|
int payload_len = 0;
|
||||||
|
u32 tcp_seq, tcp_ack;
|
||||||
|
int tcp_data_len;
|
||||||
const char *payload1 = "HTTP/1.1 200 OK\r\n"
|
const char *payload1 = "HTTP/1.1 200 OK\r\n"
|
||||||
"Content-Length: 30\r\n\r\n\r\n"
|
"Content-Length: 30\r\n\r\n\r\n"
|
||||||
"<html><body>Hi</body></html>\r\n";
|
"<html><body>Hi</body></html>\r\n";
|
||||||
union tcp_build_pkt *b = (union tcp_build_pkt *)tcp;
|
|
||||||
const int recv_payload_len = len - net_set_ack_options(b) - IP_HDR_SIZE - ETHER_HDR_SIZE;
|
|
||||||
static int next_seq;
|
|
||||||
const int bottom_payload_len = 10;
|
|
||||||
|
|
||||||
/* Don't allow the buffer to overrun */
|
/* Don't allow the buffer to overrun */
|
||||||
if (priv->recv_packets >= PKTBUFSRX)
|
if (priv->recv_packets >= PKTBUFSRX)
|
||||||
|
@ -125,35 +124,32 @@ static int sb_ack_handler(struct udevice *dev, void *packet,
|
||||||
tcp_send->tcp_dst = tcp->tcp_src;
|
tcp_send->tcp_dst = tcp->tcp_src;
|
||||||
data = (void *)tcp_send + IP_TCP_HDR_SIZE;
|
data = (void *)tcp_send + IP_TCP_HDR_SIZE;
|
||||||
|
|
||||||
if (ntohl(tcp->tcp_seq) == 1 && ntohl(tcp->tcp_ack) == 1 && recv_payload_len == 0) {
|
tcp_seq = ntohl(tcp->tcp_seq) - priv->irs;
|
||||||
// ignore ACK for three-way handshaking
|
tcp_ack = ntohl(tcp->tcp_ack) - priv->iss;
|
||||||
return 0;
|
tcp_data_len = len - ETHER_HDR_SIZE - IP_HDR_SIZE - GET_TCP_HDR_LEN_IN_BYTES(tcp->tcp_hlen);
|
||||||
} else if (ntohl(tcp->tcp_seq) == 1 && ntohl(tcp->tcp_ack) == 1) {
|
|
||||||
// recv HTTP request message and reply top half data
|
|
||||||
tcp_send->tcp_seq = htonl(ntohl(tcp->tcp_ack));
|
|
||||||
tcp_send->tcp_ack = htonl(ntohl(tcp->tcp_seq) + recv_payload_len);
|
|
||||||
|
|
||||||
payload_len = strlen(payload1) - bottom_payload_len;
|
if (tcp->tcp_flags & TCP_FIN)
|
||||||
|
tcp_data_len++;
|
||||||
|
|
||||||
|
tcp_send->tcp_seq = htonl(ntohl(tcp->tcp_ack));
|
||||||
|
tcp_send->tcp_ack = htonl(ntohl(tcp->tcp_seq) + tcp_data_len);
|
||||||
|
|
||||||
|
if (tcp_seq == 1 && tcp_ack == 1) {
|
||||||
|
if (tcp_data_len == 0) {
|
||||||
|
/* no data, wait for GET request */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reply to GET request */
|
||||||
|
payload_len = strlen(payload1);
|
||||||
memcpy(data, payload1, payload_len);
|
memcpy(data, payload1, payload_len);
|
||||||
tcp_send->tcp_flags = TCP_ACK;
|
tcp_send->tcp_flags = TCP_ACK;
|
||||||
|
} else if (tcp_ack == 1 + strlen(payload1)) {
|
||||||
next_seq = ntohl(tcp_send->tcp_seq) + payload_len;
|
|
||||||
} else if (ntohl(tcp->tcp_ack) == next_seq) {
|
|
||||||
// reply bottom half data
|
|
||||||
const int top_payload_len = strlen(payload1) - bottom_payload_len;
|
|
||||||
|
|
||||||
tcp_send->tcp_seq = htonl(next_seq);
|
|
||||||
tcp_send->tcp_ack = htonl(ntohl(tcp->tcp_seq) + recv_payload_len);
|
|
||||||
|
|
||||||
payload_len = bottom_payload_len;
|
|
||||||
memcpy(data, payload1 + top_payload_len, payload_len);
|
|
||||||
tcp_send->tcp_flags = TCP_ACK;
|
|
||||||
} else {
|
|
||||||
// close connection
|
|
||||||
tcp_send->tcp_seq = htonl(ntohl(tcp->tcp_ack));
|
|
||||||
tcp_send->tcp_ack = htonl(ntohl(tcp->tcp_seq) + 1);
|
|
||||||
payload_len = 0;
|
payload_len = 0;
|
||||||
tcp_send->tcp_flags = TCP_ACK | TCP_FIN;
|
tcp_send->tcp_flags = TCP_ACK | TCP_FIN;
|
||||||
|
} else if (tcp_ack == 2 + strlen(payload1)) {
|
||||||
|
payload_len = 0;
|
||||||
|
tcp_send->tcp_flags = TCP_ACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
tcp_send->tcp_hlen = SHIFT_TO_TCPHDRLEN_FIELD(LEN_B_TO_DW(TCP_HDR_SIZE));
|
tcp_send->tcp_hlen = SHIFT_TO_TCPHDRLEN_FIELD(LEN_B_TO_DW(TCP_HDR_SIZE));
|
||||||
|
@ -217,7 +213,7 @@ static int net_test_wget(struct unit_test_state *uts)
|
||||||
env_set("ethrotate", "no");
|
env_set("ethrotate", "no");
|
||||||
env_set("loadaddr", "0x20000");
|
env_set("loadaddr", "0x20000");
|
||||||
ut_assertok(run_command("wget ${loadaddr} 1.1.2.2:/index.html", 0));
|
ut_assertok(run_command("wget ${loadaddr} 1.1.2.2:/index.html", 0));
|
||||||
ut_assert_nextline("HTTP/1.1 200 OK");
|
ut_assert_nextline_empty();
|
||||||
ut_assert_nextline("Packets received 5, Transfer Successful");
|
ut_assert_nextline("Packets received 5, Transfer Successful");
|
||||||
ut_assert_nextline("Bytes transferred = 32 (20 hex)");
|
ut_assert_nextline("Bytes transferred = 32 (20 hex)");
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue