Lines Matching full:mdev

32 	struct mctp_dev *mdev = rcu_dereference(dev->mctp_ptr);  in __mctp_dev_get()  local
34 /* RCU guarantees that any mdev is still live. in __mctp_dev_get()
37 if (mdev) in __mctp_dev_get()
38 if (!refcount_inc_not_zero(&mdev->refs)) in __mctp_dev_get()
40 return mdev; in __mctp_dev_get()
61 struct mctp_dev *mdev, mctp_eid_t eid, in mctp_fill_addrinfo() argument
78 hdr->ifa_index = mdev->dev->ifindex; in mctp_fill_addrinfo()
95 static int mctp_dump_dev_addrinfo(struct mctp_dev *mdev, struct sk_buff *skb, in mctp_dump_dev_addrinfo() argument
104 for (; mcb->a_idx < mdev->num_addrs; mcb->a_idx++) { in mctp_dump_dev_addrinfo()
105 rc = mctp_fill_addrinfo(skb, mdev, mdev->addrs[mcb->a_idx], in mctp_dump_dev_addrinfo()
120 struct mctp_dev *mdev; in mctp_dump_addrinfo() local
138 mdev = __mctp_dev_get(dev); in mctp_dump_addrinfo()
139 if (!mdev) in mctp_dump_addrinfo()
141 rc = mctp_dump_dev_addrinfo(mdev, skb, cb); in mctp_dump_addrinfo()
142 mctp_dev_put(mdev); in mctp_dump_addrinfo()
152 static void mctp_addr_notify(struct mctp_dev *mdev, mctp_eid_t eid, int msg_type, in mctp_addr_notify() argument
156 struct net *net = dev_net(mdev->dev); in mctp_addr_notify()
164 rc = mctp_fill_addrinfo(skb, mdev, eid, msg_type, in mctp_addr_notify()
190 struct mctp_dev *mdev; in mctp_rtm_newaddr() local
215 mdev = mctp_dev_get_rtnl(dev); in mctp_rtm_newaddr()
216 if (!mdev) in mctp_rtm_newaddr()
223 if (memchr(mdev->addrs, addr->s_addr, mdev->num_addrs)) in mctp_rtm_newaddr()
226 tmp_addrs = kmalloc(mdev->num_addrs + 1, GFP_KERNEL); in mctp_rtm_newaddr()
229 memcpy(tmp_addrs, mdev->addrs, mdev->num_addrs); in mctp_rtm_newaddr()
230 tmp_addrs[mdev->num_addrs] = addr->s_addr; in mctp_rtm_newaddr()
233 spin_lock_irqsave(&mdev->addrs_lock, flags); in mctp_rtm_newaddr()
234 mdev->num_addrs++; in mctp_rtm_newaddr()
235 swap(mdev->addrs, tmp_addrs); in mctp_rtm_newaddr()
236 spin_unlock_irqrestore(&mdev->addrs_lock, flags); in mctp_rtm_newaddr()
240 mctp_addr_notify(mdev, addr->s_addr, RTM_NEWADDR, skb, nlh); in mctp_rtm_newaddr()
241 mctp_route_add_local(mdev, addr->s_addr); in mctp_rtm_newaddr()
253 struct mctp_dev *mdev; in mctp_rtm_deladdr() local
278 mdev = mctp_dev_get_rtnl(dev); in mctp_rtm_deladdr()
279 if (!mdev) in mctp_rtm_deladdr()
282 pos = memchr(mdev->addrs, addr->s_addr, mdev->num_addrs); in mctp_rtm_deladdr()
286 rc = mctp_route_remove_local(mdev, addr->s_addr); in mctp_rtm_deladdr()
291 spin_lock_irqsave(&mdev->addrs_lock, flags); in mctp_rtm_deladdr()
292 memmove(pos, pos + 1, mdev->num_addrs - 1 - (pos - mdev->addrs)); in mctp_rtm_deladdr()
293 mdev->num_addrs--; in mctp_rtm_deladdr()
294 spin_unlock_irqrestore(&mdev->addrs_lock, flags); in mctp_rtm_deladdr()
296 mctp_addr_notify(mdev, addr->s_addr, RTM_DELADDR, skb, nlh); in mctp_rtm_deladdr()
301 void mctp_dev_hold(struct mctp_dev *mdev) in mctp_dev_hold() argument
303 refcount_inc(&mdev->refs); in mctp_dev_hold()
306 void mctp_dev_put(struct mctp_dev *mdev) in mctp_dev_put() argument
308 if (mdev && refcount_dec_and_test(&mdev->refs)) { in mctp_dev_put()
309 kfree(mdev->addrs); in mctp_dev_put()
310 dev_put(mdev->dev); in mctp_dev_put()
311 kfree_rcu(mdev, rcu); in mctp_dev_put()
335 struct mctp_dev *mdev; in mctp_add_dev() local
339 mdev = kzalloc_obj(*mdev); in mctp_add_dev()
340 if (!mdev) in mctp_add_dev()
343 spin_lock_init(&mdev->addrs_lock); in mctp_add_dev()
345 mdev->net = mctp_default_net(dev_net(dev)); in mctp_add_dev()
348 refcount_set(&mdev->refs, 1); in mctp_add_dev()
349 rcu_assign_pointer(dev->mctp_ptr, mdev); in mctp_add_dev()
352 mdev->dev = dev; in mctp_add_dev()
354 return mdev; in mctp_add_dev()
360 struct mctp_dev *mdev; in mctp_fill_link_af() local
362 mdev = mctp_dev_get_rtnl(dev); in mctp_fill_link_af()
363 if (!mdev) in mctp_fill_link_af()
365 if (nla_put_u32(skb, IFLA_MCTP_NET, mdev->net)) in mctp_fill_link_af()
367 if (nla_put_u8(skb, IFLA_MCTP_PHYS_BINDING, mdev->binding)) in mctp_fill_link_af()
375 struct mctp_dev *mdev; in mctp_get_link_af_size() local
379 mdev = __mctp_dev_get(dev); in mctp_get_link_af_size()
380 if (!mdev) in mctp_get_link_af_size()
384 mctp_dev_put(mdev); in mctp_get_link_af_size()
396 struct mctp_dev *mdev; in mctp_set_link_af() local
404 mdev = mctp_dev_get_rtnl(dev); in mctp_set_link_af()
405 if (!mdev) in mctp_set_link_af()
409 WRITE_ONCE(mdev->net, nla_get_u32(tb[IFLA_MCTP_NET])); in mctp_set_link_af()
425 struct mctp_dev *mdev; in mctp_unregister() local
427 mdev = mctp_dev_get_rtnl(dev); in mctp_unregister()
428 if (!mdev) in mctp_unregister()
431 RCU_INIT_POINTER(mdev->dev->mctp_ptr, NULL); in mctp_unregister()
433 mctp_route_remove_dev(mdev); in mctp_unregister()
434 mctp_neigh_remove_dev(mdev); in mctp_unregister()
436 mctp_dev_put(mdev); in mctp_unregister()
441 struct mctp_dev *mdev; in mctp_register() local
451 mdev = mctp_add_dev(dev); in mctp_register()
452 if (IS_ERR(mdev)) in mctp_register()
453 return PTR_ERR(mdev); in mctp_register()
482 struct mctp_dev *mdev; in mctp_register_netdevice() local
484 mdev = mctp_add_dev(dev); in mctp_register_netdevice()
485 if (IS_ERR(mdev)) in mctp_register_netdevice()
486 return PTR_ERR(mdev); in mctp_register_netdevice()
488 mdev->ops = ops; in mctp_register_netdevice()
489 mdev->binding = binding; in mctp_register_netdevice()