Commit 3007f90e authored by Jeremy Kerr's avatar Jeremy Kerr Committed by Paolo Abeni
Browse files

net: mctp: separate cb from direct-addressing routing



Now that we have the dst->haddr populated by sendmsg (when extended
addressing is in use), we no longer need to stash the link-layer address
in the skb->cb.

Instead, only use skb->cb for incoming lladdr data.

While we're at it: remove cb->src, as was never used.

Signed-off-by: default avatarJeremy Kerr <jk@codeconstruct.com.au>
Link: https://patch.msgid.link/20250702-dev-forwarding-v5-4-1468191da8a4@codeconstruct.com.au


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 269936db
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -183,8 +183,8 @@ struct mctp_sk_key {
struct mctp_skb_cb {
	unsigned int	magic;
	unsigned int	net;
	int		ifindex; /* extended/direct addressing if set */
	mctp_eid_t	src;
	/* fields below provide extended addressing for ingress to recvmsg() */
	int		ifindex;
	unsigned char	halen;
	unsigned char	haddr[MAX_ADDR_LEN];
};
+5 −16
Original line number Diff line number Diff line
@@ -561,35 +561,28 @@ static int mctp_dst_input(struct mctp_dst *dst, struct sk_buff *skb)

static int mctp_dst_output(struct mctp_dst *dst, struct sk_buff *skb)
{
	struct mctp_skb_cb *cb = mctp_cb(skb);
	struct mctp_hdr *hdr = mctp_hdr(skb);
	char daddr_buf[MAX_ADDR_LEN];
	char *daddr = NULL;
	int rc;

	skb->protocol = htons(ETH_P_MCTP);
	skb->pkt_type = PACKET_OUTGOING;

	if (skb->len > dst->mtu) {
		kfree_skb(skb);
		return -EMSGSIZE;
	}

	/* If we're forwarding, we don't want to use the input path's cb,
	 * as it holds the *source* hardware addressing information.
	 *
	 * We will have a PACKET_HOST skb from the dev, or PACKET_OUTGOING
	 * from a socket; only use cb in the latter case.
	 */
	if (skb->pkt_type == PACKET_OUTGOING && cb->ifindex) {
	/* direct route; use the hwaddr we stashed in sendmsg */
		if (cb->halen != skb->dev->addr_len) {
	if (dst->halen) {
		if (dst->halen != skb->dev->addr_len) {
			/* sanity check, sendmsg should have already caught this */
			kfree_skb(skb);
			return -EMSGSIZE;
		}
		daddr = cb->haddr;
		daddr = dst->haddr;
	} else {
		skb->pkt_type = PACKET_OUTGOING;
		/* If lookup fails let the device handle daddr==NULL */
		if (mctp_neigh_lookup(dst->dev, hdr->dest, daddr_buf) == 0)
			daddr = daddr_buf;
@@ -1009,7 +1002,6 @@ int mctp_local_output(struct sock *sk, struct mctp_dst *dst,
		      struct sk_buff *skb, mctp_eid_t daddr, u8 req_tag)
{
	struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
	struct mctp_skb_cb *cb = mctp_cb(skb);
	struct mctp_sk_key *key;
	struct mctp_hdr *hdr;
	unsigned long flags;
@@ -1064,9 +1056,6 @@ int mctp_local_output(struct sock *sk, struct mctp_dst *dst,
	skb_reset_network_header(skb);
	skb->dev = dst->dev->dev;

	/* cb->net will have been set on initial ingress */
	cb->src = saddr;

	/* set up common header fields */
	hdr = mctp_hdr(skb);
	hdr->ver = 1;