@@ -137,9 +137,21 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
137
137
return rc ;
138
138
}
139
139
140
+ static inline netdev_tx_t vlan_netpoll_send_skb (struct vlan_dev_priv * vlan , struct sk_buff * skb )
141
+ {
142
+ #ifdef CONFIG_NET_POLL_CONTROLLER
143
+ if (vlan -> netpoll )
144
+ netpoll_send_skb (vlan -> netpoll , skb );
145
+ #else
146
+ BUG ();
147
+ #endif
148
+ return NETDEV_TX_OK ;
149
+ }
150
+
140
151
static netdev_tx_t vlan_dev_hard_start_xmit (struct sk_buff * skb ,
141
152
struct net_device * dev )
142
153
{
154
+ struct vlan_dev_priv * vlan = vlan_dev_priv (dev );
143
155
struct vlan_ethhdr * veth = (struct vlan_ethhdr * )(skb -> data );
144
156
unsigned int len ;
145
157
int ret ;
@@ -150,29 +162,30 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
150
162
* OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
151
163
*/
152
164
if (veth -> h_vlan_proto != htons (ETH_P_8021Q ) ||
153
- vlan_dev_priv ( dev ) -> flags & VLAN_FLAG_REORDER_HDR ) {
165
+ vlan -> flags & VLAN_FLAG_REORDER_HDR ) {
154
166
u16 vlan_tci ;
155
- vlan_tci = vlan_dev_priv ( dev ) -> vlan_id ;
167
+ vlan_tci = vlan -> vlan_id ;
156
168
vlan_tci |= vlan_dev_get_egress_qos_mask (dev , skb );
157
169
skb = __vlan_hwaccel_put_tag (skb , vlan_tci );
158
170
}
159
171
160
- skb -> dev = vlan_dev_priv ( dev ) -> real_dev ;
172
+ skb -> dev = vlan -> real_dev ;
161
173
len = skb -> len ;
162
- if (netpoll_tx_running (dev ))
163
- return skb -> dev -> netdev_ops -> ndo_start_xmit (skb , skb -> dev );
174
+ if (unlikely (netpoll_tx_running (dev )))
175
+ return vlan_netpoll_send_skb (vlan , skb );
176
+
164
177
ret = dev_queue_xmit (skb );
165
178
166
179
if (likely (ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN )) {
167
180
struct vlan_pcpu_stats * stats ;
168
181
169
- stats = this_cpu_ptr (vlan_dev_priv ( dev ) -> vlan_pcpu_stats );
182
+ stats = this_cpu_ptr (vlan -> vlan_pcpu_stats );
170
183
u64_stats_update_begin (& stats -> syncp );
171
184
stats -> tx_packets ++ ;
172
185
stats -> tx_bytes += len ;
173
186
u64_stats_update_end (& stats -> syncp );
174
187
} else {
175
- this_cpu_inc (vlan_dev_priv ( dev ) -> vlan_pcpu_stats -> tx_dropped );
188
+ this_cpu_inc (vlan -> vlan_pcpu_stats -> tx_dropped );
176
189
}
177
190
178
191
return ret ;
0 commit comments