route.c (580bdf5650fff8f66468ce491f8308f1117b7074) | route.c (fd61c6ba313de6758aeeab58fe03bd9fbbc8cea9) |
---|---|
1/* 2 * Linux INET6 implementation 3 * FIB front-end. 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * This program is free software; you can redistribute it and/or --- 3155 unchanged lines hidden (view full) --- 3164 + nla_total_size(1) /* RTA_PREF */ 3165 + lwtunnel_get_encap_size(rt->dst.lwtstate); 3166} 3167 3168static int rt6_fill_node(struct net *net, 3169 struct sk_buff *skb, struct rt6_info *rt, 3170 struct in6_addr *dst, struct in6_addr *src, 3171 int iif, int type, u32 portid, u32 seq, | 1/* 2 * Linux INET6 implementation 3 * FIB front-end. 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * This program is free software; you can redistribute it and/or --- 3155 unchanged lines hidden (view full) --- 3164 + nla_total_size(1) /* RTA_PREF */ 3165 + lwtunnel_get_encap_size(rt->dst.lwtstate); 3166} 3167 3168static int rt6_fill_node(struct net *net, 3169 struct sk_buff *skb, struct rt6_info *rt, 3170 struct in6_addr *dst, struct in6_addr *src, 3171 int iif, int type, u32 portid, u32 seq, |
3172 int prefix, int nowait, unsigned int flags) | 3172 int prefix, unsigned int flags) |
3173{ 3174 u32 metrics[RTAX_MAX]; 3175 struct rtmsg *rtm; 3176 struct nlmsghdr *nlh; 3177 long expires; 3178 u32 table; 3179 3180 if (prefix) { /* user wants prefix routes only */ --- 75 unchanged lines hidden (view full) --- 3256 rtm->rtm_src_len = 128; 3257 } else if (rtm->rtm_src_len && 3258 nla_put_in6_addr(skb, RTA_SRC, &rt->rt6i_src.addr)) 3259 goto nla_put_failure; 3260#endif 3261 if (iif) { 3262#ifdef CONFIG_IPV6_MROUTE 3263 if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) { | 3173{ 3174 u32 metrics[RTAX_MAX]; 3175 struct rtmsg *rtm; 3176 struct nlmsghdr *nlh; 3177 long expires; 3178 u32 table; 3179 3180 if (prefix) { /* user wants prefix routes only */ --- 75 unchanged lines hidden (view full) --- 3256 rtm->rtm_src_len = 128; 3257 } else if (rtm->rtm_src_len && 3258 nla_put_in6_addr(skb, RTA_SRC, &rt->rt6i_src.addr)) 3259 goto nla_put_failure; 3260#endif 3261 if (iif) { 3262#ifdef CONFIG_IPV6_MROUTE 3263 if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) { |
3264 int err = ip6mr_get_route(net, skb, rtm, nowait, 3265 portid); | 3264 int err = ip6mr_get_route(net, skb, rtm, portid); |
3266 | 3265 |
3267 if (err <= 0) { 3268 if (!nowait) { 3269 if (err == 0) 3270 return 0; 3271 goto nla_put_failure; 3272 } else { 3273 if (err == -EMSGSIZE) 3274 goto nla_put_failure; 3275 } 3276 } | 3266 if (err == 0) 3267 return 0; 3268 if (err < 0) 3269 goto nla_put_failure; |
3277 } else 3278#endif 3279 if (nla_put_u32(skb, RTA_IIF, iif)) 3280 goto nla_put_failure; 3281 } else if (dst) { 3282 struct in6_addr saddr_buf; 3283 if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 && 3284 nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf)) --- 52 unchanged lines hidden (view full) --- 3337 struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); 3338 prefix = (rtm->rtm_flags & RTM_F_PREFIX) != 0; 3339 } else 3340 prefix = 0; 3341 3342 return rt6_fill_node(arg->net, 3343 arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, 3344 NETLINK_CB(arg->cb->skb).portid, arg->cb->nlh->nlmsg_seq, | 3270 } else 3271#endif 3272 if (nla_put_u32(skb, RTA_IIF, iif)) 3273 goto nla_put_failure; 3274 } else if (dst) { 3275 struct in6_addr saddr_buf; 3276 if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 && 3277 nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf)) --- 52 unchanged lines hidden (view full) --- 3330 struct rtmsg *rtm = nlmsg_data(arg->cb->nlh); 3331 prefix = (rtm->rtm_flags & RTM_F_PREFIX) != 0; 3332 } else 3333 prefix = 0; 3334 3335 return rt6_fill_node(arg->net, 3336 arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, 3337 NETLINK_CB(arg->cb->skb).portid, arg->cb->nlh->nlmsg_seq, |
3345 prefix, 0, NLM_F_MULTI); | 3338 prefix, NLM_F_MULTI); |
3346} 3347 3348static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh) 3349{ 3350 struct net *net = sock_net(in_skb->sk); 3351 struct nlattr *tb[RTA_MAX+1]; 3352 struct rt6_info *rt; 3353 struct sk_buff *skb; --- 74 unchanged lines hidden (view full) --- 3428 */ 3429 skb_reset_mac_header(skb); 3430 skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr)); 3431 3432 skb_dst_set(skb, &rt->dst); 3433 3434 err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif, 3435 RTM_NEWROUTE, NETLINK_CB(in_skb).portid, | 3339} 3340 3341static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh) 3342{ 3343 struct net *net = sock_net(in_skb->sk); 3344 struct nlattr *tb[RTA_MAX+1]; 3345 struct rt6_info *rt; 3346 struct sk_buff *skb; --- 74 unchanged lines hidden (view full) --- 3421 */ 3422 skb_reset_mac_header(skb); 3423 skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr)); 3424 3425 skb_dst_set(skb, &rt->dst); 3426 3427 err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif, 3428 RTM_NEWROUTE, NETLINK_CB(in_skb).portid, |
3436 nlh->nlmsg_seq, 0, 0, 0); | 3429 nlh->nlmsg_seq, 0, 0); |
3437 if (err < 0) { 3438 kfree_skb(skb); 3439 goto errout; 3440 } 3441 3442 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid); 3443errout: 3444 return err; --- 10 unchanged lines hidden (view full) --- 3455 err = -ENOBUFS; 3456 seq = info->nlh ? info->nlh->nlmsg_seq : 0; 3457 3458 skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any()); 3459 if (!skb) 3460 goto errout; 3461 3462 err = rt6_fill_node(net, skb, rt, NULL, NULL, 0, | 3430 if (err < 0) { 3431 kfree_skb(skb); 3432 goto errout; 3433 } 3434 3435 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid); 3436errout: 3437 return err; --- 10 unchanged lines hidden (view full) --- 3448 err = -ENOBUFS; 3449 seq = info->nlh ? info->nlh->nlmsg_seq : 0; 3450 3451 skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any()); 3452 if (!skb) 3453 goto errout; 3454 3455 err = rt6_fill_node(net, skb, rt, NULL, NULL, 0, |
3463 event, info->portid, seq, 0, 0, nlm_flags); | 3456 event, info->portid, seq, 0, nlm_flags); |
3464 if (err < 0) { 3465 /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */ 3466 WARN_ON(err == -EMSGSIZE); 3467 kfree_skb(skb); 3468 goto errout; 3469 } 3470 rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE, 3471 info->nlh, gfp_any()); --- 434 unchanged lines hidden --- | 3457 if (err < 0) { 3458 /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */ 3459 WARN_ON(err == -EMSGSIZE); 3460 kfree_skb(skb); 3461 goto errout; 3462 } 3463 rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE, 3464 info->nlh, gfp_any()); --- 434 unchanged lines hidden --- |