[PATCH v1 24/40] j1939: socket: add j1939_sk_send_multi() and j1939_sk_send_one()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx>
---
 net/can/j1939/socket.c | 43 +++++++++++++++++++++++++++++++-----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c
index b1ab7df7eef6..a3ba03593fe6 100644
--- a/net/can/j1939/socket.c
+++ b/net/can/j1939/socket.c
@@ -677,6 +677,34 @@ static struct sk_buff *j1939_sk_alloc_skb(struct net_device *ndev, struct sock *
 	return NULL;
 }
 
+static int j1939_sk_send_multi(struct j1939_priv *priv,  struct sock *sk,
+			       struct msghdr *msg, size_t size)
+
+{
+	struct sk_buff *skb;
+	int ret;
+
+	skb = j1939_sk_alloc_skb(priv->ndev, sk, msg, size, &ret);
+	if (ret)
+		return ret;
+
+	return j1939_tp_send(priv, skb);
+}
+
+static int j1939_sk_send_one(struct j1939_priv *priv,  struct sock *sk,
+			       struct msghdr *msg, size_t size)
+
+{
+	struct sk_buff *skb;
+	int ret;
+
+	skb = j1939_sk_alloc_skb(priv->ndev, sk, msg, size, &ret);
+	if (ret)
+		return ret;
+
+	return j1939_send_one(priv, skb);
+}
+
 static int j1939_sk_sendmsg(struct socket *sock, struct msghdr *msg,
 			    size_t size)
 {
@@ -684,7 +712,6 @@ static int j1939_sk_sendmsg(struct socket *sock, struct msghdr *msg,
 	struct j1939_sock *jsk = j1939_sk(sk);
 	struct sockaddr_can *addr = msg->msg_name;
 	struct j1939_priv *priv;
-	struct sk_buff *skb;
 	struct net_device *ndev;
 	int ifindex;
 	int ret;
@@ -717,10 +744,6 @@ static int j1939_sk_sendmsg(struct socket *sock, struct msghdr *msg,
 	if (!ndev)
 		return -ENXIO;
 
-	skb = j1939_sk_alloc_skb(ndev, sk, msg, size, &ret);
-	if (!skb)
-		goto put_dev;
-
 	if (msg->msg_flags & MSG_SYN) {
 		if (msg->msg_flags & MSG_DONTWAIT) {
 			ret = j1939_sock_pending_add_first(&jsk->sk);
@@ -731,7 +754,7 @@ static int j1939_sk_sendmsg(struct socket *sock, struct msghdr *msg,
 						       j1939_sock_pending_add_first(&jsk->sk));
 		}
 		if (ret < 0)
-			goto free_skb;
+			goto put_dev;
 	} else {
 		j1939_sock_pending_add(&jsk->sk);
 	}
@@ -740,11 +763,11 @@ static int j1939_sk_sendmsg(struct socket *sock, struct msghdr *msg,
 	if (!priv)
 		return -EINVAL;
 
-	if (skb->len > 8)
+	if (size > 8)
 		/* re-route via transport protocol */
-		ret = j1939_tp_send(priv, skb);
+		ret = j1939_sk_send_multi(priv, sk, msg, size);
 	else
-		ret = j1939_send_one(priv, skb);
+		ret = j1939_sk_send_one(priv, sk, msg, size);
 
 	j1939_priv_put(priv);
 	if (ret < 0)
@@ -753,8 +776,6 @@ static int j1939_sk_sendmsg(struct socket *sock, struct msghdr *msg,
 	dev_put(ndev);
 	return (ret < 0) ? ret : size;
 
- free_skb:
-	kfree_skb(skb);
  put_dev:
 	dev_put(ndev);
 	return ret;
-- 
2.19.1




[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux