2332 if (unlikely(afinfo->family >= NPROTO))
2333 return -EAFNOSUPPORT;
2334 write_lock_bh(&xfrm_policy_afinfo_lock);
2335 if (likely(xfrm_policy_afinfo[afinfo->family] != NULL)) {
2336 if (unlikely(xfrm_policy_afinfo[afinfo->family] != afinfo))
2337 err = -EINVAL;
2338 else {
2339 struct dst_ops *dst_ops = afinfo->dst_ops;
2340 xfrm_policy_afinfo[afinfo->family] = NULL;
2341 dst_ops->kmem_cachep = NULL;
2342 dst_ops->check = NULL;
2343 dst_ops->negative_advice = NULL;
2344 dst_ops->link_failure = NULL;
2345 afinfo->garbage_collect = NULL;
2346 }
2347 }
2348 write_unlock_bh(&xfrm_policy_afinfo_lock);
2349 return err;
2350}
2351EXPORT_SYMBOL(xfrm_policy_unregister_afinfo);
2352
2353static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family)
2354{
2355 struct xfrm_policy_afinfo *afinfo;
2356 if (unlikely(family >= NPROTO))
2357 return NULL;
2358 read_lock(&xfrm_policy_afinfo_lock);
2359 afinfo = xfrm_policy_afinfo[family];
2360 if (unlikely(!afinfo))
2361 read_unlock(&xfrm_policy_afinfo_lock);
2362 return afinfo;
2363}
2364
2365static void xfrm_policy_put_afinfo(struct xfrm_policy_afinfo *afinfo)
2366{
2367 read_unlock(&xfrm_policy_afinfo_lock);
2368}
2369
2370static int xfrm_dev_event(struct notifier_block *this, unsigned long event, void *ptr)
2371{
2372 struct net_device *dev = ptr;