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 ---