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
   */
b97bf3fd8   Per Liden   [TIPC] Initial merge
48
49
50
51
  struct eth_bearer {
  	struct tipc_bearer *bearer;
  	struct net_device *dev;
  	struct packet_type tipc_packet_type;
64b32f7e3   Allan Stephens   tipc: Do timely c...
52
  	struct work_struct cleanup;
b97bf3fd8   Per Liden   [TIPC] Initial merge
53
  };
358a0d1c9   Paul Gortmaker   tipc: rename stru...
54
  static struct tipc_media eth_media_info;
b97bf3fd8   Per Liden   [TIPC] Initial merge
55
  static struct eth_bearer eth_bearers[MAX_ETH_BEARERS];
e3ec9c7d5   Allan Stephens   tipc: remove zero...
56
  static int eth_started;
b97bf3fd8   Per Liden   [TIPC] Initial merge
57
58
59
  static struct notifier_block notifier;
  
  /**
4d163a326   Allan Stephens   tipc: Add new add...
60
   * eth_media_addr_set - initialize Ethernet media address structure
3d749a6a2   Allan Stephens   tipc: Hide media-...
61
62
63
   *
   * Media-dependent "value" field stores MAC address in first 6 bytes
   * and zeroes out the remaining bytes.
4d163a326   Allan Stephens   tipc: Add new add...
64
   */
4d163a326   Allan Stephens   tipc: Add new add...
65
66
  static void eth_media_addr_set(struct tipc_media_addr *a, char *mac)
  {
3d749a6a2   Allan Stephens   tipc: Hide media-...
67
68
69
70
  	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...
71
72
73
  }
  
  /**
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
74
   * send_msg - send a TIPC message out over an Ethernet interface
b97bf3fd8   Per Liden   [TIPC] Initial merge
75
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
76
  static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
b97bf3fd8   Per Liden   [TIPC] Initial merge
77
78
79
80
  		    struct tipc_media_addr *dest)
  {
  	struct sk_buff *clone;
  	struct net_device *dev;
9fbfca013   Allan Stephens   tipc: Ensure outg...
81
  	int delta;
b97bf3fd8   Per Liden   [TIPC] Initial merge
82
83
  
  	clone = skb_clone(buf, GFP_ATOMIC);
9fbfca013   Allan Stephens   tipc: Ensure outg...
84
85
86
87
88
89
90
91
92
93
  	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
94
  	}
9fbfca013   Allan Stephens   tipc: Ensure outg...
95
96
97
  
  	skb_reset_network_header(clone);
  	clone->dev = dev;
3d749a6a2   Allan Stephens   tipc: Hide media-...
98
  	dev_hard_header(clone, dev, ETH_P_TIPC, dest->value,
9fbfca013   Allan Stephens   tipc: Ensure outg...
99
100
  			dev->dev_addr, clone->len);
  	dev_queue_xmit(clone);
0e35fd5e5   Allan Stephens   tipc: Eliminate i...
101
  	return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
102
103
104
105
  }
  
  /**
   * recv_msg - handle incoming TIPC message from an Ethernet interface
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
106
   *
f3ec75f62   Allan Stephens   [TIPC]: Improved ...
107
108
109
   * 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
110
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
111
  static int recv_msg(struct sk_buff *buf, struct net_device *dev,
b97bf3fd8   Per Liden   [TIPC] Initial merge
112
113
114
  		    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
115

721499e89   YOSHIFUJI Hideaki   netns: Use net_eq...
116
  	if (!net_eq(dev_net(dev), &init_net)) {
e730c1551   Eric W. Biederman   [NET]: Make packe...
117
118
119
  		kfree_skb(buf);
  		return 0;
  	}
b97bf3fd8   Per Liden   [TIPC] Initial merge
120
  	if (likely(eb_ptr->bearer)) {
f3ec75f62   Allan Stephens   [TIPC]: Improved ...
121
  		if (likely(buf->pkt_type <= PACKET_BROADCAST)) {
b2abd4c03   Paul Gortmaker   tipc: Optimize ha...
122
123
124
  			buf->next = NULL;
  			tipc_recv_msg(buf, eb_ptr->bearer);
  			return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
125
  		}
b97bf3fd8   Per Liden   [TIPC] Initial merge
126
  	}
5e3c8854c   Jon Maloy   [TIPC] Improved t...
127
  	kfree_skb(buf);
0e35fd5e5   Allan Stephens   tipc: Eliminate i...
128
  	return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
129
130
131
  }
  
  /**
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
132
   * enable_bearer - attach TIPC bearer to an Ethernet interface
b97bf3fd8   Per Liden   [TIPC] Initial merge
133
   */
b97bf3fd8   Per Liden   [TIPC] Initial merge
134
135
  static int enable_bearer(struct tipc_bearer *tb_ptr)
  {
cb283ead7   Jon Paul Maloy   [TIPC]: Fixed err...
136
137
  	struct net_device *dev = NULL;
  	struct net_device *pdev = NULL;
b97bf3fd8   Per Liden   [TIPC] Initial merge
138
139
140
  	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...
141
142
143
  	int pending_dev = 0;
  
  	/* Find unused Ethernet bearer structure */
d1fb62796   Allan Stephens   tipc: Fix mislead...
144
145
146
147
148
149
  	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
150
151
  
  	/* Find device with specified name */
bcd326e84   Allan Stephens   tipc: Fix unsafe ...
152
  	read_lock(&dev_base_lock);
0e65967e3   Allan Stephens   tipc: cleanup var...
153
  	for_each_netdev(&init_net, pdev) {
cb283ead7   Jon Paul Maloy   [TIPC]: Fixed err...
154
  		if (!strncmp(pdev->name, driver_name, IFNAMSIZ)) {
7562f876c   Pavel Emelianov   [NET]: Rework dev...
155
  			dev = pdev;
bcd326e84   Allan Stephens   tipc: Fix unsafe ...
156
  			dev_hold(dev);
7562f876c   Pavel Emelianov   [NET]: Rework dev...
157
158
  			break;
  		}
cb283ead7   Jon Paul Maloy   [TIPC]: Fixed err...
159
  	}
bcd326e84   Allan Stephens   tipc: Fix unsafe ...
160
  	read_unlock(&dev_base_lock);
b97bf3fd8   Per Liden   [TIPC] Initial merge
161
162
  	if (!dev)
  		return -ENODEV;
18abf0fb6   Allan Stephens   tipc: Remove redu...
163
  	/* Create Ethernet bearer for device */
18abf0fb6   Allan Stephens   tipc: Remove redu...
164
165
166
167
168
169
170
  	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
171
172
  
  	/* Associate TIPC bearer with Ethernet bearer */
b97bf3fd8   Per Liden   [TIPC] Initial merge
173
174
175
  	eb_ptr->bearer = tb_ptr;
  	tb_ptr->usr_handle = (void *)eb_ptr;
  	tb_ptr->mtu = dev->mtu;
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
176
  	tb_ptr->blocked = 0;
4d163a326   Allan Stephens   tipc: Add new add...
177
  	eth_media_addr_set(&tb_ptr->addr, (char *)dev->dev_addr);
b97bf3fd8   Per Liden   [TIPC] Initial merge
178
179
180
181
  	return 0;
  }
  
  /**
64b32f7e3   Allan Stephens   tipc: Do timely c...
182
183
184
185
   * cleanup_bearer - break association between Ethernet bearer and interface
   *
   * This routine must be invoked from a work queue because it can sleep.
   */
64b32f7e3   Allan Stephens   tipc: Do timely c...
186
187
188
189
190
191
192
193
194
195
196
  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...
197
   * disable_bearer - detach TIPC bearer from an Ethernet interface
b97bf3fd8   Per Liden   [TIPC] Initial merge
198
   *
64b32f7e3   Allan Stephens   tipc: Do timely c...
199
200
201
   * 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
202
   */
b97bf3fd8   Per Liden   [TIPC] Initial merge
203
204
  static void disable_bearer(struct tipc_bearer *tb_ptr)
  {
64b32f7e3   Allan Stephens   tipc: Do timely c...
205
206
207
208
209
  	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
210
211
212
213
214
  }
  
  /**
   * recv_notification - handle device updates from OS
   *
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
215
   * Change the state of the Ethernet bearer (if any) associated with the
b97bf3fd8   Per Liden   [TIPC] Initial merge
216
217
   * specified device.
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
218
  static int recv_notification(struct notifier_block *nb, unsigned long evt,
b97bf3fd8   Per Liden   [TIPC] Initial merge
219
220
221
222
223
  			     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...
224
  	if (!net_eq(dev_net(dev), &init_net))
e9dc86534   Eric W. Biederman   [NET]: Make devic...
225
  		return NOTIFY_DONE;
b97bf3fd8   Per Liden   [TIPC] Initial merge
226
227
228
229
230
231
  	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...
232
  	eb_ptr->bearer->mtu = dev->mtu;
b97bf3fd8   Per Liden   [TIPC] Initial merge
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
  
  	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...
248
  	case NETDEV_CHANGEADDR:
b97bf3fd8   Per Liden   [TIPC] Initial merge
249
  		tipc_block_bearer(eb_ptr->bearer->name);
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
250
  		tipc_continue(eb_ptr->bearer);
b97bf3fd8   Per Liden   [TIPC] Initial merge
251
252
  		break;
  	case NETDEV_UNREGISTER:
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
253
  	case NETDEV_CHANGENAME:
b97bf3fd8   Per Liden   [TIPC] Initial merge
254
255
256
257
258
259
260
261
262
  		tipc_disable_bearer(eb_ptr->bearer->name);
  		break;
  	}
  	return NOTIFY_OK;
  }
  
  /**
   * eth_addr2str - convert Ethernet address to string
   */
c61b666e2   Allan Stephens   tipc: Improve han...
263
  static int eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size)
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
264
  {
c61b666e2   Allan Stephens   tipc: Improve han...
265
266
  	if (str_size < 18)	/* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */
  		return 1;
3d749a6a2   Allan Stephens   tipc: Hide media-...
267
  	sprintf(str_buf, "%pM", a->value);
c61b666e2   Allan Stephens   tipc: Improve han...
268
  	return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
269
  }
4d163a326   Allan Stephens   tipc: Add new add...
270
271
272
  /**
   * eth_str2addr - convert string to Ethernet address
   */
4d163a326   Allan Stephens   tipc: Add new add...
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
  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
   */
4d163a326   Allan Stephens   tipc: Add new add...
292
293
294
295
  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-...
296
  	memcpy(msg_area + ETH_ADDR_OFFSET, a->value, ETH_ALEN);
4d163a326   Allan Stephens   tipc: Add new add...
297
298
299
300
301
302
  	return 0;
  }
  
  /**
   * eth_str2addr - convert message header address format to Ethernet format
   */
4d163a326   Allan Stephens   tipc: Add new add...
303
304
305
306
307
308
309
310
  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...
311
312
313
  /*
   * Ethernet media registration info
   */
358a0d1c9   Paul Gortmaker   tipc: rename stru...
314
  static struct tipc_media eth_media_info = {
706767da1   Allan Stephens   tipc: Register ne...
315
316
317
318
  	.send_msg	= send_msg,
  	.enable_bearer	= enable_bearer,
  	.disable_bearer	= disable_bearer,
  	.addr2str	= eth_addr2str,
4d163a326   Allan Stephens   tipc: Add new add...
319
320
321
  	.str2addr	= eth_str2addr,
  	.addr2msg	= eth_addr2msg,
  	.msg2addr	= eth_msg2addr,
3d749a6a2   Allan Stephens   tipc: Hide media-...
322
323
  	.bcast_addr	= { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
  			    TIPC_MEDIA_TYPE_ETH, 1 },
706767da1   Allan Stephens   tipc: Register ne...
324
325
326
327
328
329
  	.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
330
  /**
4323add67   Per Liden   [TIPC] Avoid poll...
331
   * tipc_eth_media_start - activate Ethernet bearer support
b97bf3fd8   Per Liden   [TIPC] Initial merge
332
333
334
335
   *
   * Register Ethernet media type with TIPC bearer code.  Also register
   * with OS for notifications about device state changes.
   */
4323add67   Per Liden   [TIPC] Avoid poll...
336
  int tipc_eth_media_start(void)
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
337
  {
b97bf3fd8   Per Liden   [TIPC] Initial merge
338
339
340
341
  	int res;
  
  	if (eth_started)
  		return -EINVAL;
706767da1   Allan Stephens   tipc: Register ne...
342
  	res = tipc_register_media(&eth_media_info);
b97bf3fd8   Per Liden   [TIPC] Initial merge
343
344
345
346
347
348
349
350
351
352
353
354
  	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...
355
   * tipc_eth_media_stop - deactivate Ethernet bearer support
b97bf3fd8   Per Liden   [TIPC] Initial merge
356
   */
4323add67   Per Liden   [TIPC] Avoid poll...
357
  void tipc_eth_media_stop(void)
b97bf3fd8   Per Liden   [TIPC] Initial merge
358
  {
b97bf3fd8   Per Liden   [TIPC] Initial merge
359
360
  	if (!eth_started)
  		return;
64b32f7e3   Allan Stephens   tipc: Do timely c...
361
  	flush_scheduled_work();
b97bf3fd8   Per Liden   [TIPC] Initial merge
362
  	unregister_netdevice_notifier(&notifier);
b97bf3fd8   Per Liden   [TIPC] Initial merge
363
364
  	eth_started = 0;
  }