|
@@ -46,12 +46,14 @@
|
|
|
* @bearer: ptr to associated "generic" bearer structure
|
|
|
* @dev: ptr to associated Ethernet network device
|
|
|
* @tipc_packet_type: used in binding TIPC to Ethernet driver
|
|
|
+ * @setup: work item used when enabling bearer
|
|
|
* @cleanup: work item used when disabling bearer
|
|
|
*/
|
|
|
struct eth_bearer {
|
|
|
struct tipc_bearer *bearer;
|
|
|
struct net_device *dev;
|
|
|
struct packet_type tipc_packet_type;
|
|
|
+ struct work_struct setup;
|
|
|
struct work_struct cleanup;
|
|
|
};
|
|
|
|
|
@@ -142,6 +144,17 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * setup_bearer - setup association between Ethernet bearer and interface
|
|
|
+ */
|
|
|
+static void setup_bearer(struct work_struct *work)
|
|
|
+{
|
|
|
+ struct eth_bearer *eb_ptr =
|
|
|
+ container_of(work, struct eth_bearer, setup);
|
|
|
+
|
|
|
+ dev_add_pack(&eb_ptr->tipc_packet_type);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* enable_bearer - attach TIPC bearer to an Ethernet interface
|
|
|
*/
|
|
@@ -182,7 +195,8 @@ static int enable_bearer(struct tipc_bearer *tb_ptr)
|
|
|
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);
|
|
|
+ INIT_WORK(&eb_ptr->setup, setup_bearer);
|
|
|
+ schedule_work(&eb_ptr->setup);
|
|
|
|
|
|
/* Associate TIPC bearer with Ethernet bearer */
|
|
|
eb_ptr->bearer = tb_ptr;
|