2424#include <net/llc_s_ac.h>
2525#include <net/llc_s_ev.h>
2626#include <net/llc_sap.h>
27-
27+ #include <net/sock.h>
2828
2929/**
3030 * llc_sap_action_unitdata_ind - forward UI PDU to network layer
@@ -40,6 +40,26 @@ int llc_sap_action_unitdata_ind(struct llc_sap *sap, struct sk_buff *skb)
4040 return 0 ;
4141}
4242
43+ static int llc_prepare_and_xmit (struct sk_buff * skb )
44+ {
45+ struct llc_sap_state_ev * ev = llc_sap_ev (skb );
46+ struct sk_buff * nskb ;
47+ int rc ;
48+
49+ rc = llc_mac_hdr_init (skb , ev -> saddr .mac , ev -> daddr .mac );
50+ if (rc )
51+ return rc ;
52+
53+ nskb = skb_clone (skb , GFP_ATOMIC );
54+ if (!nskb )
55+ return - ENOMEM ;
56+
57+ if (skb -> sk )
58+ skb_set_owner_w (nskb , skb -> sk );
59+
60+ return dev_queue_xmit (nskb );
61+ }
62+
4363/**
4464 * llc_sap_action_send_ui - sends UI PDU resp to UNITDATA REQ to MAC layer
4565 * @sap: SAP
@@ -52,17 +72,12 @@ int llc_sap_action_unitdata_ind(struct llc_sap *sap, struct sk_buff *skb)
5272int llc_sap_action_send_ui (struct llc_sap * sap , struct sk_buff * skb )
5373{
5474 struct llc_sap_state_ev * ev = llc_sap_ev (skb );
55- int rc ;
5675
5776 llc_pdu_header_init (skb , LLC_PDU_TYPE_U , ev -> saddr .lsap ,
5877 ev -> daddr .lsap , LLC_PDU_CMD );
5978 llc_pdu_init_as_ui_cmd (skb );
60- rc = llc_mac_hdr_init (skb , ev -> saddr .mac , ev -> daddr .mac );
61- if (likely (!rc )) {
62- skb_get (skb );
63- rc = dev_queue_xmit (skb );
64- }
65- return rc ;
79+
80+ return llc_prepare_and_xmit (skb );
6681}
6782
6883/**
@@ -77,17 +92,12 @@ int llc_sap_action_send_ui(struct llc_sap *sap, struct sk_buff *skb)
7792int llc_sap_action_send_xid_c (struct llc_sap * sap , struct sk_buff * skb )
7893{
7994 struct llc_sap_state_ev * ev = llc_sap_ev (skb );
80- int rc ;
8195
8296 llc_pdu_header_init (skb , LLC_PDU_TYPE_U_XID , ev -> saddr .lsap ,
8397 ev -> daddr .lsap , LLC_PDU_CMD );
8498 llc_pdu_init_as_xid_cmd (skb , LLC_XID_NULL_CLASS_2 , 0 );
85- rc = llc_mac_hdr_init (skb , ev -> saddr .mac , ev -> daddr .mac );
86- if (likely (!rc )) {
87- skb_get (skb );
88- rc = dev_queue_xmit (skb );
89- }
90- return rc ;
99+
100+ return llc_prepare_and_xmit (skb );
91101}
92102
93103/**
@@ -133,17 +143,12 @@ int llc_sap_action_send_xid_r(struct llc_sap *sap, struct sk_buff *skb)
133143int llc_sap_action_send_test_c (struct llc_sap * sap , struct sk_buff * skb )
134144{
135145 struct llc_sap_state_ev * ev = llc_sap_ev (skb );
136- int rc ;
137146
138147 llc_pdu_header_init (skb , LLC_PDU_TYPE_U , ev -> saddr .lsap ,
139148 ev -> daddr .lsap , LLC_PDU_CMD );
140149 llc_pdu_init_as_test_cmd (skb );
141- rc = llc_mac_hdr_init (skb , ev -> saddr .mac , ev -> daddr .mac );
142- if (likely (!rc )) {
143- skb_get (skb );
144- rc = dev_queue_xmit (skb );
145- }
146- return rc ;
150+
151+ return llc_prepare_and_xmit (skb );
147152}
148153
149154int llc_sap_action_send_test_r (struct llc_sap * sap , struct sk_buff * skb )
0 commit comments