[U-Boot] [PATCH v12 1/3] Consolidating UDP header functions.
Christian Gmeiner
christian.gmeiner at gmail.com
Tue Aug 14 07:26:30 UTC 2018
As I am interested in tcp support for u-boot recently I will try to review
your patches :)
>
> To make it possible to add TCP versions of the same, while reusing
> IP portions. This patch should not change any behavior.
>
> All references to TCP removed
> Used most recent version of u-boot June 22 13, 2918
> Series to fix patman errors over Licensing declaration
> END
>
> Series-notes
> TCP with Selective Acknowledgment (SACK) is currently the protocol
> with highest speed transfers, for fast multi-hop networks.
> END
>
> Signed-off-by: Duncan Hare <DH at Synoia.com>
> Signed-off-by: Duncan Hare <DuncanCHare at yahoo.com>
> ---
>
> include/net.h | 6 +++++-
> net/net.c | 34 ++++++++++++++++++++++++----------
> net/ping.c | 7 +------
> 3 files changed, 30 insertions(+), 17 deletions(-)
>
> diff --git a/include/net.h b/include/net.h
> index 5760685556..a54160fff6 100644
> --- a/include/net.h
> +++ b/include/net.h
> @@ -593,7 +593,8 @@ int net_set_ether(uchar *xet, const uchar *dest_ethaddr, uint prot);
> int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot);
>
> /* Set IP header */
> -void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source);
> +void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
> + u16 pkt_len, u8 proto);
> void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport,
> int sport, int len);
>
> @@ -667,6 +668,9 @@ static inline void net_send_packet(uchar *pkt, int len)
> * @param sport Source UDP port
> * @param payload_len Length of data after the UDP header
> */
> +int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
> + int payload_len, int proto, u8 action, u32 tcp_seq_num,
> + u32 tcp_ack_num);
> int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport,
> int sport, int payload_len);
>
> diff --git a/net/net.c b/net/net.c
> index b4563a4cab..f831c34599 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -786,6 +786,14 @@ void net_set_timeout_handler(ulong iv, thand_f *f)
> int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport, int sport,
> int payload_len)
> {
> +return net_send_ip_packet(ether, dest, dport, sport, payload_len,
> + IPPROTO_UDP, 0, 0, 0);
Missing tab before return net_...
> +}
> +
> +int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
> + int payload_len, int proto, u8 action, u32 tcp_seq_num,
> + u32 tcp_ack_num)
> +{
> uchar *pkt;
> int eth_hdr_size;
> int pkt_hdr_size;
> @@ -806,9 +814,15 @@ int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport, int sport,
> pkt = (uchar *)net_tx_packet;
>
> eth_hdr_size = net_set_ether(pkt, ether, PROT_IP);
> - pkt += eth_hdr_size;
> - net_set_udp_header(pkt, dest, dport, sport, payload_len);
> - pkt_hdr_size = eth_hdr_size + IP_UDP_HDR_SIZE;
> +
> + switch (proto) {
> + case IPPROTO_UDP:
> + net_set_udp_header(pkt + eth_hdr_size, dest,
> + dport, sport, payload_len);
> + pkt_hdr_size = eth_hdr_size + IP_UDP_HDR_SIZE;
> + break;
> + default: return -EINVAL;
> + }
>
> /* if MAC address was not discovered yet, do an ARP request */
> if (memcmp(ether, net_null_ethaddr, 6) == 0) {
> @@ -1434,7 +1448,8 @@ int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot)
> }
> }
>
> -void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source)
> +void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
> + u16 pkt_len, u8 proto)
> {
> struct ip_udp_hdr *ip = (struct ip_udp_hdr *)pkt;
>
> @@ -1444,11 +1459,12 @@ void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source)
> /* IP_HDR_SIZE / 4 (not including UDP) */
> ip->ip_hl_v = 0x45;
> ip->ip_tos = 0;
> - ip->ip_len = htons(IP_HDR_SIZE);
> + ip->ip_len = htons(pkt_len);
> + ip->ip_p = proto;
> ip->ip_id = htons(net_ip_id++);
> ip->ip_off = htons(IP_FLAGS_DFRAG); /* Don't fragment */
> ip->ip_ttl = 255;
> - ip->ip_sum = 0;
> + ip->ip_sum = compute_ip_checksum(ip, IP_HDR_SIZE);
> /* already in network byte order */
> net_copy_ip((void *)&ip->ip_src, &source);
> /* already in network byte order */
> @@ -1468,10 +1484,8 @@ void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport, int sport,
> if (len & 1)
> pkt[IP_UDP_HDR_SIZE + len] = 0;
>
> - net_set_ip_header(pkt, dest, net_ip);
> - ip->ip_len = htons(IP_UDP_HDR_SIZE + len);
> - ip->ip_p = IPPROTO_UDP;
> - ip->ip_sum = compute_ip_checksum(ip, IP_HDR_SIZE);
> + net_set_ip_header(pkt, dest, net_ip, IP_UDP_HDR_SIZE + len,
> + IPPROTO_UDP);
>
> ip->udp_src = htons(sport);
> ip->udp_dst = htons(dport);
> diff --git a/net/ping.c b/net/ping.c
> index 3e5461a36a..d5d914bf2a 100644
> --- a/net/ping.c
> +++ b/net/ping.c
> @@ -22,14 +22,9 @@ static void set_icmp_header(uchar *pkt, struct in_addr dest)
> /*
> * Construct an IP and ICMP header.
> */
> - struct ip_hdr *ip = (struct ip_hdr *)pkt;
> struct icmp_hdr *icmp = (struct icmp_hdr *)(pkt + IP_HDR_SIZE);
>
> - net_set_ip_header(pkt, dest, net_ip);
> -
> - ip->ip_len = htons(IP_ICMP_HDR_SIZE);
> - ip->ip_p = IPPROTO_ICMP;
> - ip->ip_sum = compute_ip_checksum(ip, IP_HDR_SIZE);
> + net_set_ip_header(pkt, dest, net_ip, IP_ICMP_HDR_SIZE, IPPROTO_ICMP);
>
> icmp->type = ICMP_ECHO_REQUEST;
> icmp->code = 0;
> --
> 2.11.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
--
greets
--
Christian Gmeiner, MSc
https://christian-gmeiner.info
More information about the U-Boot
mailing list