Blame view

net/tipc/eth_media.c 10.4 KB
b97bf3fd8   Per Liden   [TIPC] Initial merge
1
2
  /*
   * net/tipc/eth_media.c: Ethernet bearer support for TIPC
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
3
   *
f3ec75f62   Allan Stephens   [TIPC]: Improved ...
4
   * Copyright (c) 2001-2007, Ericsson AB
bcd326e84   Allan Stephens   tipc: Fix unsafe ...
5
   * Copyright (c) 2005-2008, 2011, Wind River Systems
b97bf3fd8   Per Liden   [TIPC] Initial merge
6
7
   * All rights reserved.
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
8
   * Redistribution and use in source and binary forms, with or without
b97bf3fd8   Per Liden   [TIPC] Initial merge
9
10
   * modification, are permitted provided that the following conditions are met:
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
11
12
13
14
15
16
17
18
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. Neither the names of the copyright holders nor the names of its
   *    contributors may be used to endorse or promote products derived from
   *    this software without specific prior written permission.
b97bf3fd8   Per Liden   [TIPC] Initial merge
19
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   * Alternatively, this software may be distributed under the terms of the
   * GNU General Public License ("GPL") version 2 as published by the Free
   * Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
b97bf3fd8   Per Liden   [TIPC] Initial merge
34
35
   * POSSIBILITY OF SUCH DAMAGE.
   */
d265fef6d   Allan Stephens   tipc: Remove obso...
36
37
  #include "core.h"
  #include "bearer.h"
909234cdd   Allan Stephens   tipc: Lower limit...
38
  #define MAX_ETH_BEARERS		MAX_BEARERS
b97bf3fd8   Per Liden   [TIPC] Initial merge
39

4d163a326   Allan Stephens   tipc: Add new add...
40
  #define ETH_ADDR_OFFSET	4	/* message header offset of MAC address */
b97bf3fd8   Per Liden   [TIPC] Initial merge
41
42
43
44
45
  /**
   * struct eth_bearer - Ethernet bearer data structure
   * @bearer: ptr to associated "generic" bearer structure
   * @dev: ptr to associated Ethernet network device
   * @tipc_packet_type: used in binding TIPC to Ethernet driver
64b32f7e3   Allan Stephens   tipc: Do timely c...
46
   * @cleanup: work item used when disabling bearer
b97bf3fd8   Per Liden   [TIPC] Initial merge
47
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
48

b97bf3fd8   Per Liden   [TIPC] Initial merge
49
50
51
52
  struct eth_bearer {
  	struct tipc_bearer *bearer;
  	struct net_device *dev;
  	struct packet_type tipc_packet_type;
64b32f7e3   Allan Stephens   tipc: Do timely c...
53
  	struct work_struct cleanup;
b97bf3fd8   Per Liden   [TIPC] Initial merge
54
  };
358a0d1c9   Paul Gortmaker   tipc: rename stru...
55
  static struct tipc_media eth_media_info;
b97bf3fd8   Per Liden   [TIPC] Initial merge
56
  static struct eth_bearer eth_bearers[MAX_ETH_BEARERS];
e3ec9c7d5   Allan Stephens   tipc: remove zero...
57
  static int eth_started;
b97bf3fd8   Per Liden   [TIPC] Initial merge
58
59
60
  static struct notifier_block notifier;
  
  /**
4d163a326   Allan Stephens   tipc: Add new add...
61
   * eth_media_addr_set - initialize Ethernet media address structure
3d749a6a2   Allan Stephens   tipc: Hide media-...
62
63
64
   *
   * Media-dependent "value" field stores MAC address in first 6 bytes
   * and zeroes out the remaining bytes.
4d163a326   Allan Stephens   tipc: Add new add...
65
66
67
68
   */
  
  static void eth_media_addr_set(struct tipc_media_addr *a, char *mac)
  {
3d749a6a2   Allan Stephens   tipc: Hide media-...
69
70
71
72
  	memcpy(a->value, mac, ETH_ALEN);
  	memset(a->value + ETH_ALEN, 0, sizeof(a->value) - ETH_ALEN);
  	a->media_id = TIPC_MEDIA_TYPE_ETH;
  	a->broadcast = !memcmp(mac, eth_media_info.bcast_addr.value, ETH_ALEN);
4d163a326   Allan Stephens   tipc: Add new add...
73
74
75
  }
  
  /**
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
76
   * send_msg - send a TIPC message out over an Ethernet interface
b97bf3fd8   Per Liden   [TIPC] Initial merge
77
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
78
  static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
b97bf3fd8   Per Liden   [TIPC] Initial merge
79
80
81
82
  		    struct tipc_media_addr *dest)
  {
  	struct sk_buff *clone;
  	struct net_device *dev;
9fbfca013   Allan Stephens   tipc: Ensure outg...
83
  	int delta;
b97bf3fd8   Per Liden   [TIPC] Initial merge
84
85
  
  	clone = skb_clone(buf, GFP_ATOMIC);
9fbfca013   Allan Stephens   tipc: Ensure outg...
86
87
88
89
90
91
92
93
94
95
  	if (!clone)
  		return 0;
  
  	dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev;
  	delta = dev->hard_header_len - skb_headroom(buf);
  
  	if ((delta > 0) &&
  	    pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
  		kfree_skb(clone);
  		return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
96
  	}
9fbfca013   Allan Stephens   tipc: Ensure outg...
97
98
99
  
  	skb_reset_network_header(clone);
  	clone->dev = dev;
3d749a6a2   Allan Stephens   tipc: Hide media-...
100
  	dev_hard_header(clone, dev, ETH_P_TIPC, dest->value,
9fbfca013   Allan Stephens   tipc: Ensure outg...
101
102
  			dev->dev_addr, clone->len);
  	dev_queue_xmit(clone);
0e35fd5e5   Allan Stephens   tipc: Eliminate i...
103
  	return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
104
105
106
107
  }
  
  /**
   * recv_msg - handle incoming TIPC message from an Ethernet interface
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
108
   *
f3ec75f62   Allan Stephens   [TIPC]: Improved ...
109
110
111
   * Accept only packets explicitly sent to this node, or broadcast packets;
   * ignores packets sent using Ethernet multicast, and traffic sent to other
   * nodes (which can happen if interface is running in promiscuous mode).
b97bf3fd8   Per Liden   [TIPC] Initial merge
112
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
113
  static int recv_msg(struct sk_buff *buf, struct net_device *dev,
b97bf3fd8   Per Liden   [TIPC] Initial merge
114
115
116
  		    struct packet_type *pt, struct net_device *orig_dev)
  {
  	struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv;
b97bf3fd8   Per Liden   [TIPC] Initial merge
117

721499e89   YOSHIFUJI Hideaki   netns: Use net_eq...
118
  	if (!net_eq(dev_net(dev), &init_net)) {
e730c1551   Eric W. Biederman   [NET]: Make packe...
119
120
121
  		kfree_skb(buf);
  		return 0;
  	}
b97bf3fd8   Per Liden   [TIPC] Initial merge
122
  	if (likely(eb_ptr->bearer)) {
f3ec75f62   Allan Stephens   [TIPC]: Improved ...
123
  		if (likely(buf->pkt_type <= PACKET_BROADCAST)) {
b2abd4c03   Paul Gortmaker   tipc: Optimize ha...
124
125
126
  			buf->next = NULL;
  			tipc_recv_msg(buf, eb_ptr->bearer);
  			return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
127
  		}
b97bf3fd8   Per Liden   [TIPC] Initial merge
128
  	}
5e3c8854c   Jon Maloy   [TIPC] Improved t...
129
  	kfree_skb(buf);
0e35fd5e5   Allan Stephens   tipc: Eliminate i...
130
  	return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
131
132
133
  }
  
  /**
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
134
   * enable_bearer - attach TIPC bearer to an Ethernet interface
b97bf3fd8   Per Liden   [TIPC] Initial merge
135
136
137
138
   */
  
  static int enable_bearer(struct tipc_bearer *tb_ptr)
  {
cb283ead7   Jon Paul Maloy   [TIPC]: Fixed err...
139
140
  	struct net_device *dev = NULL;
  	struct net_device *pdev = NULL;
b97bf3fd8   Per Liden   [TIPC] Initial merge
141
142
143
  	struct eth_bearer *eb_ptr = &eth_bearers[0];
  	struct eth_bearer *stop = &eth_bearers[MAX_ETH_BEARERS];
  	char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1;
d1fb62796   Allan Stephens   tipc: Fix mislead...
144
145
146
147
148
149
150
151
152
153
  	int pending_dev = 0;
  
  	/* Find unused Ethernet bearer structure */
  
  	while (eb_ptr->dev) {
  		if (!eb_ptr->bearer)
  			pending_dev++;
  		if (++eb_ptr == stop)
  			return pending_dev ? -EAGAIN : -EDQUOT;
  	}
b97bf3fd8   Per Liden   [TIPC] Initial merge
154
155
  
  	/* Find device with specified name */
cb283ead7   Jon Paul Maloy   [TIPC]: Fixed err...
156

bcd326e84   Allan Stephens   tipc: Fix unsafe ...
157
  	read_lock(&dev_base_lock);
0e65967e3   Allan Stephens   tipc: cleanup var...
158
  	for_each_netdev(&init_net, pdev) {
cb283ead7   Jon Paul Maloy   [TIPC]: Fixed err...
159
  		if (!strncmp(pdev->name, driver_name, IFNAMSIZ)) {
7562f876c   Pavel Emelianov   [NET]: Rework dev...
160
  			dev = pdev;
bcd326e84   Allan Stephens   tipc: Fix unsafe ...
161
  			dev_hold(dev);
7562f876c   Pavel Emelianov   [NET]: Rework dev...
162
163
  			break;
  		}
cb283ead7   Jon Paul Maloy   [TIPC]: Fixed err...
164
  	}
bcd326e84   Allan Stephens   tipc: Fix unsafe ...
165
  	read_unlock(&dev_base_lock);
b97bf3fd8   Per Liden   [TIPC] Initial merge
166
167
  	if (!dev)
  		return -ENODEV;
18abf0fb6   Allan Stephens   tipc: Remove redu...
168
169
170
171
172
173
174
175
176
  	/* Create Ethernet bearer for device */
  
  	eb_ptr->dev = dev;
  	eb_ptr->tipc_packet_type.type = htons(ETH_P_TIPC);
  	eb_ptr->tipc_packet_type.dev = dev;
  	eb_ptr->tipc_packet_type.func = recv_msg;
  	eb_ptr->tipc_packet_type.af_packet_priv = eb_ptr;
  	INIT_LIST_HEAD(&(eb_ptr->tipc_packet_type.list));
  	dev_add_pack(&eb_ptr->tipc_packet_type);
b97bf3fd8   Per Liden   [TIPC] Initial merge
177
178
179
180
181
182
  
  	/* Associate TIPC bearer with Ethernet bearer */
  
  	eb_ptr->bearer = tb_ptr;
  	tb_ptr->usr_handle = (void *)eb_ptr;
  	tb_ptr->mtu = dev->mtu;
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
183
  	tb_ptr->blocked = 0;
4d163a326   Allan Stephens   tipc: Add new add...
184
  	eth_media_addr_set(&tb_ptr->addr, (char *)dev->dev_addr);
b97bf3fd8   Per Liden   [TIPC] Initial merge
185
186
187
188
  	return 0;
  }
  
  /**
64b32f7e3   Allan Stephens   tipc: Do timely c...
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
   * cleanup_bearer - break association between Ethernet bearer and interface
   *
   * This routine must be invoked from a work queue because it can sleep.
   */
  
  static void cleanup_bearer(struct work_struct *work)
  {
  	struct eth_bearer *eb_ptr =
  		container_of(work, struct eth_bearer, cleanup);
  
  	dev_remove_pack(&eb_ptr->tipc_packet_type);
  	dev_put(eb_ptr->dev);
  	eb_ptr->dev = NULL;
  }
  
  /**
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
205
   * disable_bearer - detach TIPC bearer from an Ethernet interface
b97bf3fd8   Per Liden   [TIPC] Initial merge
206
   *
64b32f7e3   Allan Stephens   tipc: Do timely c...
207
208
209
   * Mark Ethernet bearer as inactive so that incoming buffers are thrown away,
   * then get worker thread to complete bearer cleanup.  (Can't do cleanup
   * here because cleanup code needs to sleep and caller holds spinlocks.)
b97bf3fd8   Per Liden   [TIPC] Initial merge
210
211
212
213
   */
  
  static void disable_bearer(struct tipc_bearer *tb_ptr)
  {
64b32f7e3   Allan Stephens   tipc: Do timely c...
214
215
216
217
218
  	struct eth_bearer *eb_ptr = (struct eth_bearer *)tb_ptr->usr_handle;
  
  	eb_ptr->bearer = NULL;
  	INIT_WORK(&eb_ptr->cleanup, cleanup_bearer);
  	schedule_work(&eb_ptr->cleanup);
b97bf3fd8   Per Liden   [TIPC] Initial merge
219
220
221
222
223
  }
  
  /**
   * recv_notification - handle device updates from OS
   *
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
224
   * Change the state of the Ethernet bearer (if any) associated with the
b97bf3fd8   Per Liden   [TIPC] Initial merge
225
226
   * specified device.
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
227
  static int recv_notification(struct notifier_block *nb, unsigned long evt,
b97bf3fd8   Per Liden   [TIPC] Initial merge
228
229
230
231
232
  			     void *dv)
  {
  	struct net_device *dev = (struct net_device *)dv;
  	struct eth_bearer *eb_ptr = &eth_bearers[0];
  	struct eth_bearer *stop = &eth_bearers[MAX_ETH_BEARERS];
721499e89   YOSHIFUJI Hideaki   netns: Use net_eq...
233
  	if (!net_eq(dev_net(dev), &init_net))
e9dc86534   Eric W. Biederman   [NET]: Make devic...
234
  		return NOTIFY_DONE;
b97bf3fd8   Per Liden   [TIPC] Initial merge
235
236
237
238
239
240
  	while ((eb_ptr->dev != dev)) {
  		if (++eb_ptr == stop)
  			return NOTIFY_DONE;	/* couldn't find device */
  	}
  	if (!eb_ptr->bearer)
  		return NOTIFY_DONE;		/* bearer had been disabled */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
241
  	eb_ptr->bearer->mtu = dev->mtu;
b97bf3fd8   Per Liden   [TIPC] Initial merge
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
  
  	switch (evt) {
  	case NETDEV_CHANGE:
  		if (netif_carrier_ok(dev))
  			tipc_continue(eb_ptr->bearer);
  		else
  			tipc_block_bearer(eb_ptr->bearer->name);
  		break;
  	case NETDEV_UP:
  		tipc_continue(eb_ptr->bearer);
  		break;
  	case NETDEV_DOWN:
  		tipc_block_bearer(eb_ptr->bearer->name);
  		break;
  	case NETDEV_CHANGEMTU:
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
257
  	case NETDEV_CHANGEADDR:
b97bf3fd8   Per Liden   [TIPC] Initial merge
258
  		tipc_block_bearer(eb_ptr->bearer->name);
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
259
  		tipc_continue(eb_ptr->bearer);
b97bf3fd8   Per Liden   [TIPC] Initial merge
260
261
  		break;
  	case NETDEV_UNREGISTER:
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
262
  	case NETDEV_CHANGENAME:
b97bf3fd8   Per Liden   [TIPC] Initial merge
263
264
265
266
267
268
269
270
271
  		tipc_disable_bearer(eb_ptr->bearer->name);
  		break;
  	}
  	return NOTIFY_OK;
  }
  
  /**
   * eth_addr2str - convert Ethernet address to string
   */
c61b666e2   Allan Stephens   tipc: Improve han...
272
  static int eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size)
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
273
  {
c61b666e2   Allan Stephens   tipc: Improve han...
274
275
  	if (str_size < 18)	/* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */
  		return 1;
3d749a6a2   Allan Stephens   tipc: Hide media-...
276
  	sprintf(str_buf, "%pM", a->value);
c61b666e2   Allan Stephens   tipc: Improve han...
277
  	return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
278
  }
4d163a326   Allan Stephens   tipc: Add new add...
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
  /**
   * eth_str2addr - convert string to Ethernet address
   */
  
  static int eth_str2addr(struct tipc_media_addr *a, char *str_buf)
  {
  	char mac[ETH_ALEN];
  	int r;
  
  	r = sscanf(str_buf, "%02x:%02x:%02x:%02x:%02x:%02x",
  		       (u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2],
  		       (u32 *)&mac[3], (u32 *)&mac[4], (u32 *)&mac[5]);
  
  	if (r != ETH_ALEN)
  		return 1;
  
  	eth_media_addr_set(a, mac);
  	return 0;
  }
  
  /**
   * eth_str2addr - convert Ethernet address format to message header format
   */
  
  static int eth_addr2msg(struct tipc_media_addr *a, char *msg_area)
  {
  	memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE);
  	msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH;
3d749a6a2   Allan Stephens   tipc: Hide media-...
307
  	memcpy(msg_area + ETH_ADDR_OFFSET, a->value, ETH_ALEN);
4d163a326   Allan Stephens   tipc: Add new add...
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
  	return 0;
  }
  
  /**
   * eth_str2addr - convert message header address format to Ethernet format
   */
  
  static int eth_msg2addr(struct tipc_media_addr *a, char *msg_area)
  {
  	if (msg_area[TIPC_MEDIA_TYPE_OFFSET] != TIPC_MEDIA_TYPE_ETH)
  		return 1;
  
  	eth_media_addr_set(a, msg_area + ETH_ADDR_OFFSET);
  	return 0;
  }
706767da1   Allan Stephens   tipc: Register ne...
323
324
325
  /*
   * Ethernet media registration info
   */
358a0d1c9   Paul Gortmaker   tipc: rename stru...
326
  static struct tipc_media eth_media_info = {
706767da1   Allan Stephens   tipc: Register ne...
327
328
329
330
  	.send_msg	= send_msg,
  	.enable_bearer	= enable_bearer,
  	.disable_bearer	= disable_bearer,
  	.addr2str	= eth_addr2str,
4d163a326   Allan Stephens   tipc: Add new add...
331
332
333
  	.str2addr	= eth_str2addr,
  	.addr2msg	= eth_addr2msg,
  	.msg2addr	= eth_msg2addr,
3d749a6a2   Allan Stephens   tipc: Hide media-...
334
335
  	.bcast_addr	= { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
  			    TIPC_MEDIA_TYPE_ETH, 1 },
706767da1   Allan Stephens   tipc: Register ne...
336
337
338
339
340
341
  	.priority	= TIPC_DEF_LINK_PRI,
  	.tolerance	= TIPC_DEF_LINK_TOL,
  	.window		= TIPC_DEF_LINK_WIN,
  	.type_id	= TIPC_MEDIA_TYPE_ETH,
  	.name		= "eth"
  };
b97bf3fd8   Per Liden   [TIPC] Initial merge
342
  /**
4323add67   Per Liden   [TIPC] Avoid poll...
343
   * tipc_eth_media_start - activate Ethernet bearer support
b97bf3fd8   Per Liden   [TIPC] Initial merge
344
345
346
347
   *
   * Register Ethernet media type with TIPC bearer code.  Also register
   * with OS for notifications about device state changes.
   */
4323add67   Per Liden   [TIPC] Avoid poll...
348
  int tipc_eth_media_start(void)
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
349
  {
b97bf3fd8   Per Liden   [TIPC] Initial merge
350
351
352
353
  	int res;
  
  	if (eth_started)
  		return -EINVAL;
706767da1   Allan Stephens   tipc: Register ne...
354
  	res = tipc_register_media(&eth_media_info);
b97bf3fd8   Per Liden   [TIPC] Initial merge
355
356
357
358
359
360
361
362
363
364
365
366
  	if (res)
  		return res;
  
  	notifier.notifier_call = &recv_notification;
  	notifier.priority = 0;
  	res = register_netdevice_notifier(&notifier);
  	if (!res)
  		eth_started = 1;
  	return res;
  }
  
  /**
4323add67   Per Liden   [TIPC] Avoid poll...
367
   * tipc_eth_media_stop - deactivate Ethernet bearer support
b97bf3fd8   Per Liden   [TIPC] Initial merge
368
   */
4323add67   Per Liden   [TIPC] Avoid poll...
369
  void tipc_eth_media_stop(void)
b97bf3fd8   Per Liden   [TIPC] Initial merge
370
  {
b97bf3fd8   Per Liden   [TIPC] Initial merge
371
372
  	if (!eth_started)
  		return;
64b32f7e3   Allan Stephens   tipc: Do timely c...
373
  	flush_scheduled_work();
b97bf3fd8   Per Liden   [TIPC] Initial merge
374
  	unregister_netdevice_notifier(&notifier);
b97bf3fd8   Per Liden   [TIPC] Initial merge
375
376
  	eth_started = 0;
  }