diff --git a/SOURCES/openvswitch-3.2.0.patch b/SOURCES/openvswitch-3.2.0.patch
index 67b3665..9cab150 100644
--- a/SOURCES/openvswitch-3.2.0.patch
+++ b/SOURCES/openvswitch-3.2.0.patch
@@ -2856,6 +2856,30 @@ index 5d2635946d..3a8068b12c 100644
              goto out;
          }
  
+diff --git a/lib/dp-packet.h b/lib/dp-packet.h
+index 70ddf8aa45..25a0d31a1e 100644
+--- a/lib/dp-packet.h
++++ b/lib/dp-packet.h
+@@ -1142,10 +1142,17 @@ static inline void
+ dp_packet_ip_set_header_csum(struct dp_packet *p)
+ {
+     struct ip_header *ip = dp_packet_l3(p);
++    size_t l3_size = dp_packet_l3_size(p);
++    size_t ip_len;
+ 
+     ovs_assert(ip);
+-    ip->ip_csum = 0;
+-    ip->ip_csum = csum(ip, sizeof *ip);
++
++    ip_len = IP_IHL(ip->ip_ihl_ver) * 4;
++
++    if (OVS_LIKELY(ip_len >= IP_HEADER_LEN && ip_len < l3_size)) {
++        ip->ip_csum = 0;
++        ip->ip_csum = csum(ip, ip_len);
++    }
+ }
+ 
+ /* Returns 'true' if the packet 'p' has good integrity and the
 diff --git a/lib/dpctl.c b/lib/dpctl.c
 index 79b82a1767..a63169b177 100644
 --- a/lib/dpctl.c
@@ -7031,7 +7055,7 @@ index 1013098a18..b33d50673f 100644
 +       echo "$0: unexpected error probing Python unit test requirements" >&2 ;;
  esac
 diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
-index 67adf27fb1..061e13af85 100644
+index 67adf27fb1..5c49546064 100644
 --- a/tests/dpif-netdev.at
 +++ b/tests/dpif-netdev.at
 @@ -746,19 +746,25 @@ OVS_VSWITCHD_START(
@@ -7080,7 +7104,7 @@ index 67adf27fb1..061e13af85 100644
  ])
  
  # Check if packets entering the datapath with csum offloading
-@@ -779,36 +782,93 @@ AT_CHECK([tail -n 1 p2.pcap.txt], [0], [dnl
+@@ -779,36 +782,132 @@ AT_CHECK([tail -n 1 p2.pcap.txt], [0], [dnl
  # by the datapath.
  AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum=true])
  AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum_set_good=true])
@@ -7122,9 +7146,48 @@ index 67adf27fb1..061e13af85 100644
 -AT_CHECK([tail -n 1 p2.pcap.txt], [0], [dnl
 -0a8f394fe0738abf7e2f058408004500003433e0400040060990c0a87b02c0a80101d4781451a962ad5417ed297b801000e5c1fd00000101080a2524d2345c7fe1c4
 +AT_CHECK_UNQUOTED([tail -n 1 p2.pcap.txt], [0], [${good_expected}
- ])
- OVS_VSWITCHD_STOP
- AT_CLEANUP
++])
++
++dnl Test with IP optional fields in a valid packet.  Note that neither this
++dnl packet nor the following one contain a correct checksum.  OVS is
++dnl expected to replace this dummy checksum with a valid one if possible.
++m4_define([OPT_PKT], m4_join([],
++dnl eth(dst=aa:aa:aa:aa:aa:aa,src=bb:bb:bb:bb:bb:bb,type=0x0800)
++[aaaaaaaaaaaabbbbbbbbbbbb0800],
++dnl ipv4(dst=10.0.0.2,src=10.0.0.1,proto=1,len=60,tot_len=68,csum=0xeeee)
++[4f000044abab00004001eeee0a0000010a000002],
++dnl IPv4 Opt: type 7 (Record Route) len 39 + type 0 (EOL).
++[07270c010203040a000003000000000000000000],
++[0000000000000000000000000000000000000000],
++dnl icmp(type=8,code=0), csum 0x3e2f incorrect, should be 0x412f.
++[08003e2fb6d00000]))
++
++dnl IP header indicates optional fields but doesn't contain any.
++m4_define([MICROGRAM], m4_join([],
++dnl eth(dst=aa:aa:aa:aa:aa:aa,src=bb:bb:bb:bb:bb:bb,type=0x0800)
++[aaaaaaaaaaaabbbbbbbbbbbb0800],
++dnl ipv4(dst=10.0.0.2,src=10.0.0.1,proto=1,len=60,tot_len=68,csum=0xeeee)
++[4f000044abab00004001eeee0a0000010a000002]))
++
++AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum=true])
++AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum_set_good=true])
++dnl In this version of OVS, checksum offload packets have their checksum
++dnl resovled in upcalls.  Send the packet twice so the checksum offload is
++dnl resolved after the packet is modified.
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 OPT_PKT])
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 OPT_PKT])
++AT_CHECK([ovs-appctl netdev-dummy/receive p1 MICROGRAM])
++AT_CHECK([ovs-pcap p2.pcap > p2.pcap.txt 2>&1])
++
++dnl Build the expected modified packets.  The first packet has a valid IPv4
++dnl checksum and modified destination IP address.  The second packet isn't
++dnl expected to change.
++AT_CHECK([echo "OPT_PKT" | sed -e "s/0a000002/c0a80101/" -e "s/eeee/dd2e/" > expout])
++AT_CHECK([echo "MICROGRAM" >> expout])
++AT_CHECK([tail -n 2 p2.pcap.txt], [0], [expout])
++
++OVS_VSWITCHD_STOP
++AT_CLEANUP
 +
 +AT_SETUP([datapath - Actions Autovalidator Checksum])
 +
@@ -7139,7 +7202,7 @@ index 67adf27fb1..061e13af85 100644
 +AT_DATA([flows.txt], [dnl
 +  in_port=p0,ip,actions=mod_nw_src=10.1.1.1,p1
 +  in_port=p0,ipv6,actions=set_field:fc00::100->ipv6_src,p1
-+])
+ ])
 +AT_CHECK([ovs-ofctl del-flows br0])
 +AT_CHECK([ovs-ofctl -Oopenflow13 add-flows br0 flows.txt])
 +
@@ -7186,8 +7249,8 @@ index 67adf27fb1..061e13af85 100644
 +AT_CHECK_UNQUOTED([tail -n 1 p1.pcap.txt], [0], [${good_expected_v6}
 +])
 +
-+OVS_VSWITCHD_STOP
-+AT_CLEANUP
+ OVS_VSWITCHD_STOP
+ AT_CLEANUP
 diff --git a/tests/learn.at b/tests/learn.at
 index d127fed348..d0bcc83633 100644
 --- a/tests/learn.at
diff --git a/SPECS/openvswitch3.2.spec b/SPECS/openvswitch3.2.spec
index 7cca409..7e27153 100644
--- a/SPECS/openvswitch3.2.spec
+++ b/SPECS/openvswitch3.2.spec
@@ -57,7 +57,7 @@ Summary: Open vSwitch
 Group: System Environment/Daemons daemon/database/utilities
 URL: http://www.openvswitch.org/
 Version: 3.2.0
-Release: 98%{?dist}
+Release: 99%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -763,6 +763,12 @@ exit 0
 %endif
 
 %changelog
+* Tue Aug 27 2024 Open vSwitch CI <ovs-ci@redhat.com> - 3.2.0-99
+- Merging upstream branch-3.2 [RH git: 35c31c786b]
+    Commit list:
+    659bbfe452 dp-packet: Correct IPv4 checksum calculation. ()
+
+
 * Wed Aug 14 2024 Open vSwitch CI <ovs-ci@redhat.com> - 3.2.0-98
 - Merging upstream branch-3.2 [RH git: 4d4a155af8]
     Commit list: