24
24
#include <net/llc_s_ac.h>
25
25
#include <net/llc_s_ev.h>
26
26
#include <net/llc_sap.h>
27
-
27
+ #include <net/sock.h>
28
28
29
29
/**
30
30
* llc_sap_action_unit_data_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)
40
40
return 0 ;
41
41
}
42
42
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
+
43
63
/**
44
64
* llc_sap_action_send_ui - sends UI PDU resp to UNITDATA REQ to MAC layer
45
65
* @sap: SAP
@@ -52,17 +72,12 @@ int llc_sap_action_unitdata_ind(struct llc_sap *sap, struct sk_buff *skb)
52
72
int llc_sap_action_send_ui (struct llc_sap * sap , struct sk_buff * skb )
53
73
{
54
74
struct llc_sap_state_ev * ev = llc_sap_ev (skb );
55
- int rc ;
56
75
57
76
llc_pdu_header_init (skb , LLC_PDU_TYPE_U , ev -> saddr .lsap ,
58
77
ev -> daddr .lsap , LLC_PDU_CMD );
59
78
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 );
66
81
}
67
82
68
83
/**
@@ -77,17 +92,12 @@ int llc_sap_action_send_ui(struct llc_sap *sap, struct sk_buff *skb)
77
92
int llc_sap_action_send_xid_c (struct llc_sap * sap , struct sk_buff * skb )
78
93
{
79
94
struct llc_sap_state_ev * ev = llc_sap_ev (skb );
80
- int rc ;
81
95
82
96
llc_pdu_header_init (skb , LLC_PDU_TYPE_U_XID , ev -> saddr .lsap ,
83
97
ev -> daddr .lsap , LLC_PDU_CMD );
84
98
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 );
91
101
}
92
102
93
103
/**
@@ -133,17 +143,12 @@ int llc_sap_action_send_xid_r(struct llc_sap *sap, struct sk_buff *skb)
133
143
int llc_sap_action_send_test_c (struct llc_sap * sap , struct sk_buff * skb )
134
144
{
135
145
struct llc_sap_state_ev * ev = llc_sap_ev (skb );
136
- int rc ;
137
146
138
147
llc_pdu_header_init (skb , LLC_PDU_TYPE_U , ev -> saddr .lsap ,
139
148
ev -> daddr .lsap , LLC_PDU_CMD );
140
149
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 );
147
152
}
148
153
149
154
int llc_sap_action_send_test_r (struct llc_sap * sap , struct sk_buff * skb )
0 commit comments