Move IPv4 header construction from netpoll_send_udp() into a new
static helper function push_ipv4(). This completes the refactoring
started with IPv6 header handling, creating symmetric helper functions
for both IP versions.

Changes include:
1. Extracting IPv4 header setup logic into push_ipv4()
2. Replacing inline IPv4 code with helper call
3. Moving eth assignment after helper calls for consistency

The refactoring reduces code duplication and improves maintainability
by isolating IP version-specific logic.

Signed-off-by: Breno Leitao <lei...@debian.org>
---
 net/core/netpoll.c | 62 +++++++++++++++++++++++++++++++-----------------------
 1 file changed, 36 insertions(+), 26 deletions(-)

diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index 247a73762fc2c..ff64e94df5351 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -441,14 +441,44 @@ static void push_ipv6(struct netpoll *np, struct sk_buff 
*skb, int len)
        eth->h_proto = htons(ETH_P_IPV6);
 }
 
+static void push_ipv4(struct netpoll *np, struct sk_buff *skb, int len)
+{
+       static atomic_t ip_ident;
+       struct ethhdr *eth;
+       struct iphdr *iph;
+       int ip_len;
+
+       ip_len = len + sizeof(struct udphdr) + sizeof(struct iphdr);
+
+       skb_push(skb, sizeof(struct iphdr));
+       skb_reset_network_header(skb);
+       iph = ip_hdr(skb);
+
+       /* iph->version = 4; iph->ihl = 5; */
+       *(unsigned char *)iph = 0x45;
+       iph->tos = 0;
+       put_unaligned(htons(ip_len), &iph->tot_len);
+       iph->id = htons(atomic_inc_return(&ip_ident));
+       iph->frag_off = 0;
+       iph->ttl = 64;
+       iph->protocol = IPPROTO_UDP;
+       iph->check = 0;
+       put_unaligned(np->local_ip.ip, &iph->saddr);
+       put_unaligned(np->remote_ip.ip, &iph->daddr);
+       iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
+
+       eth = skb_push(skb, ETH_HLEN);
+       skb_reset_mac_header(skb);
+       skb->protocol = htons(ETH_P_IP);
+       eth->h_proto = htons(ETH_P_IP);
+}
+
 int netpoll_send_udp(struct netpoll *np, const char *msg, int len)
 {
        int total_len, ip_len, udp_len;
        struct sk_buff *skb;
        struct udphdr *udph;
-       struct iphdr *iph;
        struct ethhdr *eth;
-       static atomic_t ip_ident;
 
        if (!IS_ENABLED(CONFIG_PREEMPT_RT))
                WARN_ON_ONCE(!irqs_disabled());
@@ -477,32 +507,12 @@ int netpoll_send_udp(struct netpoll *np, const char *msg, 
int len)
        udph->len = htons(udp_len);
 
        netpoll_udp_checksum(np, skb, len);
-       if (np->ipv6) {
+       if (np->ipv6)
                push_ipv6(np, skb, len);
-               eth = eth_hdr(skb);
-       } else {
-               skb_push(skb, sizeof(struct iphdr));
-               skb_reset_network_header(skb);
-               iph = ip_hdr(skb);
-
-               /* iph->version = 4; iph->ihl = 5; */
-               *(unsigned char *)iph = 0x45;
-               iph->tos      = 0;
-               put_unaligned(htons(ip_len), &(iph->tot_len));
-               iph->id       = htons(atomic_inc_return(&ip_ident));
-               iph->frag_off = 0;
-               iph->ttl      = 64;
-               iph->protocol = IPPROTO_UDP;
-               iph->check    = 0;
-               put_unaligned(np->local_ip.ip, &(iph->saddr));
-               put_unaligned(np->remote_ip.ip, &(iph->daddr));
-               iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
-
-               eth = skb_push(skb, ETH_HLEN);
-               skb_reset_mac_header(skb);
-               skb->protocol = eth->h_proto = htons(ETH_P_IP);
-       }
+       else
+               push_ipv4(np, skb, len);
 
+       eth = eth_hdr(skb);
        ether_addr_copy(eth->h_source, np->dev->dev_addr);
        ether_addr_copy(eth->h_dest, np->remote_mac);
 

-- 
2.47.1


Reply via email to