Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7b92aff authored by Kumar Sanghvi's avatar Kumar Sanghvi Committed by David S. Miller
Browse files

CAIF: Fix IPv6 support in receive path for GPRS/3G



Checks version field of IP in the receive path for GPRS/3G data
and appropriately sets the value of skb->protocol.

Signed-off-by: default avatarSjur Braendeland <sjur.brandeland@stericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 545ecdc3
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -76,6 +76,8 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
	struct chnl_net *priv  = container_of(layr, struct chnl_net, chnl);
	int pktlen;
	int err = 0;
	const u8 *ip_version;
	u8 buf;

	priv = container_of(layr, struct chnl_net, chnl);

@@ -90,7 +92,21 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
	 * send the packet to the net stack.
	 */
	skb->dev = priv->netdev;

	/* check the version of IP */
	ip_version = skb_header_pointer(skb, 0, 1, &buf);
	if (!ip_version)
		return -EINVAL;
	switch (*ip_version >> 4) {
	case 4:
		skb->protocol = htons(ETH_P_IP);
		break;
	case 6:
		skb->protocol = htons(ETH_P_IPV6);
		break;
	default:
		return -EINVAL;
	}

	/* If we change the header in loop mode, the checksum is corrupted. */
	if (priv->conn_req.protocol == CAIFPROTO_DATAGRAM_LOOP)