[PATCH v1 30/40] j1939: transport: rework j1939_session_fresh_new and j1939_tp_tx_dat_new paths

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

 



we don't need to copy data from previous skb for following reasons:
- some of fields are overwritten by can_send()
- other fields can be extracted from priv or skcb.

Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx>
---
 net/can/j1939/transport.c | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c
index 7121e1ccb477..e45ecbe8d3d8 100644
--- a/net/can/j1939/transport.c
+++ b/net/can/j1939/transport.c
@@ -359,7 +359,8 @@ static void j1939_skbcb_swap(struct j1939_sk_buff_cb *skcb)
 	swap(skcb->dst_flags, skcb->src_flags);
 }
 
-static struct sk_buff *j1939_tp_tx_dat_new(struct sk_buff *related,
+static struct sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv,
+					   struct j1939_sk_buff_cb *re_skcb,
 					   bool extd, bool ctl,
 					   bool swap_src_dst)
 {
@@ -371,16 +372,13 @@ static struct sk_buff *j1939_tp_tx_dat_new(struct sk_buff *related,
 	if (unlikely(!skb))
 		return ERR_PTR(-ENOMEM);
 
-	skb->dev = related->dev;
+	skb->dev = priv->ndev;
 	can_skb_reserve(skb);
-	can_skb_prv(skb)->ifindex = can_skb_prv(related)->ifindex;
+	can_skb_prv(skb)->ifindex = priv->ndev->ifindex;
 	/* reserve CAN header */
 	skb_reserve(skb, offsetof(struct can_frame, data));
-	skb->protocol = related->protocol;
-	skb->pkt_type = related->pkt_type;
-	skb->ip_summed = related->ip_summed;
 
-	memcpy(skb->cb, related->cb, sizeof(skb->cb));
+	memcpy(skb->cb, re_skcb, sizeof(skb->cb));
 	skcb = j1939_skb_to_cb(skb);
 	j1939_fix_cb(skcb);
 	if (swap_src_dst)
@@ -406,10 +404,9 @@ static int j1939_tp_tx_dat(struct j1939_session *session,
 			   const u8 *dat, int len)
 {
 	struct j1939_priv *priv = session->priv;
-	struct sk_buff *skb, *se_skb;
+	struct sk_buff *skb;
 
-	se_skb = j1939_session_skb_find(session);
-	skb = j1939_tp_tx_dat_new(se_skb, session->extd, false, false);
+	skb = j1939_tp_tx_dat_new(priv, &session->skcb, session->extd, false, false);
 	if (IS_ERR(skb))
 		return PTR_ERR(skb);
 
@@ -431,7 +428,7 @@ static int j1939_xtp_do_tx_ctl(struct j1939_priv *priv,
 	if (!j1939_tp_im_involved(re_skcb, swap_src_dst))
 		return 0;
 
-	skb = j1939_tp_tx_dat_new(related, extd, true, swap_src_dst);
+	skb = j1939_tp_tx_dat_new(priv, re_skcb, extd, true, swap_src_dst);
 	if (IS_ERR(skb))
 		return PTR_ERR(skb);
 
@@ -926,10 +923,9 @@ static struct j1939_session *j1939_session_new(struct j1939_priv *priv,
 
 static struct j1939_session *j1939_session_fresh_new(struct j1939_priv *priv,
 						     int size,
-						     struct sk_buff *rel_skb,
+						     const struct j1939_sk_buff_cb *rel_skcb,
 						     pgn_t pgn)
 {
-	const struct j1939_sk_buff_cb *rel_skcb = j1939_skb_to_cb(rel_skb);
 	struct sk_buff *skb;
 	struct j1939_sk_buff_cb *skcb;
 	struct j1939_session *session;
@@ -938,9 +934,9 @@ static struct j1939_session *j1939_session_fresh_new(struct j1939_priv *priv,
 	if (unlikely(!skb))
 		return NULL;
 
-	skb->dev = rel_skb->dev;
+	skb->dev = priv->ndev;
 	can_skb_reserve(skb);
-	can_skb_prv(skb)->ifindex = can_skb_prv(rel_skb)->ifindex;
+	can_skb_prv(skb)->ifindex = priv->ndev->ifindex;
 	skcb = j1939_skb_to_cb(skb);
 	memcpy(skcb, rel_skcb, sizeof(*skcb));
 	j1939_fix_cb(skcb);
@@ -1021,7 +1017,7 @@ struct j1939_session *j1939_xtp_rx_rts_new(struct j1939_priv *priv,
 		return NULL;
 	}
 
-	session = j1939_session_fresh_new(priv, len, skb, pgn);
+	session = j1939_session_fresh_new(priv, len, skcb, pgn);
 	if (!session) {
 		j1939_xtp_tx_abort(priv, skb, extd, true,
 				   J1939_XTP_ABORT_RESOURCE, pgn);
-- 
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