On 10/15/26 2:47 PM, Fernando Fernandez Mancera wrote: > The SCTP checksum is a CRC32c over the whole SCTP packet. set_sctp() > updates it as old_csum ^ old_correct_csum ^ new_csum, with the two CRCs > computed over the bytes of the current skb only. That is correct only > when the skb holds the whole SCTP packet. For a first fragment, and for > a later fragment, it holds just a part of it, and the CRC delta of a > change at the start of the packet depends on how many bytes follow, so > the checksum written is wrong. The receiver drops the reassembled > packet. > > validate_set() accepts SCTP set action for any flow with ip.proto set to > SCTP, regardless of the fragmentation bits, as it only receives the > masked key. As the checksum cannot be fixed up without the whole > datagram, fail the action for packets that are IP fragments of either > family, so the packet is dropped with OVS_DROP_ACTION_ERROR instead of > being forwarded with modified ports and an invalid checksum. > > Link: > https://lore.kernel.org/netdev/[email protected]/ > Fixes: a175a723301a ("openvswitch: Add SCTP support") > Signed-off-by: Fernando Fernandez Mancera <[email protected]> > --- > net/openvswitch/actions.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c > index 4aade471afc4..12e339cbf791 100644 > --- a/net/openvswitch/actions.c > +++ b/net/openvswitch/actions.c > @@ -674,6 +674,9 @@ static int set_sctp(struct sk_buff *skb, struct > sw_flow_key *flow_key, > __le32 old_correct_csum, new_csum, old_csum; > int err; > > + if (flow_key->ip.frag != OVS_FRAG_TYPE_NONE) > + return -EINVAL; > + > err = skb_ensure_writable(skb, sctphoff + sizeof(struct sctphdr)); > if (unlikely(err)) > return err;
Similar story here as with the previous patch. Reviewed-by: Ilya Maximets <[email protected]> _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
