Signed-off-by: Serhey Popovych <serhe.popov...@gmail.com>
---
 ip/ipl2tp.c |   37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c
index 7c5ed31..8aaee74 100644
--- a/ip/ipl2tp.c
+++ b/ip/ipl2tp.c
@@ -296,7 +296,7 @@ static int get_response(struct nlmsghdr *n, void *arg)
        struct l2tp_data *data = arg;
        struct l2tp_parm *p = &data->config;
        struct rtattr *attrs[L2TP_ATTR_MAX + 1];
-       struct rtattr *nla_stats;
+       struct rtattr *nla_stats, *rta;
        int len;
 
        /* Validate message and parse attributes */
@@ -352,30 +352,25 @@ static int get_response(struct nlmsghdr *n, void *arg)
 
        if (attrs[L2TP_ATTR_RECV_TIMEOUT])
                p->reorder_timeout = 
rta_getattr_u64(attrs[L2TP_ATTR_RECV_TIMEOUT]);
-       if (attrs[L2TP_ATTR_IP_SADDR]) {
-               p->local_ip.family = AF_INET;
-               p->local_ip.data[0] = 
rta_getattr_u32(attrs[L2TP_ATTR_IP_SADDR]);
-               p->local_ip.bytelen = 4;
-               p->local_ip.bitlen = -1;
-       }
-       if (attrs[L2TP_ATTR_IP_DADDR]) {
-               p->peer_ip.family = AF_INET;
-               p->peer_ip.data[0] = rta_getattr_u32(attrs[L2TP_ATTR_IP_DADDR]);
-               p->peer_ip.bytelen = 4;
-               p->peer_ip.bitlen = -1;
-       }
-       if (attrs[L2TP_ATTR_IP6_SADDR]) {
+
+       rta = attrs[L2TP_ATTR_IP_SADDR];
+       p->local_ip.family = AF_INET;
+       if (!rta) {
+               rta = attrs[L2TP_ATTR_IP6_SADDR];
                p->local_ip.family = AF_INET6;
-               memcpy(&p->local_ip.data, RTA_DATA(attrs[L2TP_ATTR_IP6_SADDR]),
-                       p->local_ip.bytelen = 16);
-               p->local_ip.bitlen = -1;
        }
-       if (attrs[L2TP_ATTR_IP6_DADDR]) {
+       if (rta && get_addr_rta(&p->local_ip, rta, p->local_ip.family))
+               return -1;
+
+       rta = attrs[L2TP_ATTR_IP_DADDR];
+       p->peer_ip.family = AF_INET;
+       if (!rta) {
+               rta = attrs[L2TP_ATTR_IP6_DADDR];
                p->peer_ip.family = AF_INET6;
-               memcpy(&p->peer_ip.data, RTA_DATA(attrs[L2TP_ATTR_IP6_DADDR]),
-                       p->peer_ip.bytelen = 16);
-               p->peer_ip.bitlen = -1;
        }
+       if (rta && get_addr_rta(&p->peer_ip, rta, p->peer_ip.family))
+               return -1;
+
        if (attrs[L2TP_ATTR_UDP_SPORT])
                p->local_udp_port = rta_getattr_u16(attrs[L2TP_ATTR_UDP_SPORT]);
        if (attrs[L2TP_ATTR_UDP_DPORT])
-- 
1.7.10.4

Reply via email to