Separate out if configuration into setupif
So we can later apply it to ppp interfaces. Better seen with diff -w
This commit is contained in:
parent
b2bc6da827
commit
5df78e9467
1 changed files with 95 additions and 90 deletions
49
l2tpns.c
49
l2tpns.c
|
|
@ -253,6 +253,7 @@ struct Tstats *_statistics = NULL;
|
|||
struct Tringbuffer *ringbuffer = NULL;
|
||||
#endif
|
||||
|
||||
static int setupif(int ifidx, uint32_t mru, int config_addr);
|
||||
static ssize_t rtnetlink_send(struct nlmsghdr *nh);
|
||||
static ssize_t genetlink_send(struct nlmsghdr *nh);
|
||||
static ssize_t genetlink_recv(void *buf, ssize_t len);
|
||||
|
|
@ -1510,8 +1511,17 @@ static void inittun(void)
|
|||
LOG(0, 0, 0, "Can't get tun interface index\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (setupif(tunidx, MRU, 1) < 0)
|
||||
{
|
||||
LOG(0, 0, 0, "Error while setting up tun device: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Set up an interface for serving as gateway
|
||||
static int setupif(int ifidx, uint32_t mru, int config_addr)
|
||||
{
|
||||
struct {
|
||||
// interface setting
|
||||
struct nlmsghdr nh;
|
||||
|
|
@ -1521,7 +1531,7 @@ static void inittun(void)
|
|||
} ifmsg;
|
||||
char rtdata[32]; // 32 should be enough
|
||||
} req;
|
||||
uint32_t txqlen, mtu;
|
||||
uint32_t txqlen;
|
||||
in_addr_t ip;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
|
@ -1531,7 +1541,7 @@ static void inittun(void)
|
|||
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifmsg.ifinfo));
|
||||
|
||||
req.ifmsg.ifinfo.ifi_family = AF_UNSPEC;
|
||||
req.ifmsg.ifinfo.ifi_index = tunidx;
|
||||
req.ifmsg.ifinfo.ifi_index = ifidx;
|
||||
req.ifmsg.ifinfo.ifi_flags |= IFF_UP; // set interface up
|
||||
req.ifmsg.ifinfo.ifi_change = IFF_UP; // only change this flag
|
||||
|
||||
|
|
@ -1539,12 +1549,13 @@ static void inittun(void)
|
|||
txqlen = 1000;
|
||||
rtnetlink_addattr(&req.nh, IFLA_TXQLEN, &txqlen, sizeof(txqlen));
|
||||
/* set MTU to modem MRU */
|
||||
mtu = MRU;
|
||||
rtnetlink_addattr(&req.nh, IFLA_MTU, &mtu, sizeof(mtu));
|
||||
rtnetlink_addattr(&req.nh, IFLA_MTU, &mru, sizeof(mru));
|
||||
|
||||
if (rtnetlink_send(&req.nh) < 0)
|
||||
goto senderror;
|
||||
return -1;
|
||||
|
||||
if (config_addr)
|
||||
{
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
req.nh.nlmsg_type = RTM_NEWADDR;
|
||||
|
|
@ -1554,7 +1565,7 @@ static void inittun(void)
|
|||
req.ifmsg.ifaddr.ifa_family = AF_INET;
|
||||
req.ifmsg.ifaddr.ifa_prefixlen = 32;
|
||||
req.ifmsg.ifaddr.ifa_scope = RT_SCOPE_UNIVERSE;
|
||||
req.ifmsg.ifaddr.ifa_index = tunidx;
|
||||
req.ifmsg.ifaddr.ifa_index = ifidx;
|
||||
|
||||
if (config->nbmultiaddress > 1)
|
||||
{
|
||||
|
|
@ -1564,7 +1575,7 @@ static void inittun(void)
|
|||
ip = config->iftun_n_address[i];
|
||||
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip, sizeof(ip));
|
||||
if (rtnetlink_send(&req.nh) < 0)
|
||||
goto senderror;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -1576,10 +1587,9 @@ static void inittun(void)
|
|||
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip, sizeof(ip));
|
||||
|
||||
if (rtnetlink_send(&req.nh) < 0)
|
||||
goto senderror;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Only setup IPv6 on the tun device if we have a configured prefix
|
||||
if (config->ipv6_prefix.s6_addr[0]) {
|
||||
|
|
@ -1594,7 +1604,7 @@ static void inittun(void)
|
|||
req.ifmsg.ifaddr.ifa_family = AF_INET6;
|
||||
req.ifmsg.ifaddr.ifa_prefixlen = 64;
|
||||
req.ifmsg.ifaddr.ifa_scope = RT_SCOPE_LINK;
|
||||
req.ifmsg.ifaddr.ifa_index = tunidx;
|
||||
req.ifmsg.ifaddr.ifa_index = ifidx;
|
||||
|
||||
// Link local address is FE80::1
|
||||
memset(&ip6, 0, sizeof(ip6));
|
||||
|
|
@ -1604,7 +1614,7 @@ static void inittun(void)
|
|||
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip6, sizeof(ip6));
|
||||
|
||||
if (rtnetlink_send(&req.nh) < 0)
|
||||
goto senderror;
|
||||
return -1;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
|
|
@ -1615,7 +1625,7 @@ static void inittun(void)
|
|||
req.ifmsg.ifaddr.ifa_family = AF_INET6;
|
||||
req.ifmsg.ifaddr.ifa_prefixlen = 64;
|
||||
req.ifmsg.ifaddr.ifa_scope = RT_SCOPE_UNIVERSE;
|
||||
req.ifmsg.ifaddr.ifa_index = tunidx;
|
||||
req.ifmsg.ifaddr.ifa_index = ifidx;
|
||||
|
||||
// Global address is prefix::1
|
||||
ip6 = config->ipv6_prefix;
|
||||
|
|
@ -1623,7 +1633,7 @@ static void inittun(void)
|
|||
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip6, sizeof(ip6));
|
||||
|
||||
if (rtnetlink_send(&req.nh) < 0)
|
||||
goto senderror;
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
|
@ -1632,7 +1642,7 @@ static void inittun(void)
|
|||
req.nh.nlmsg_len = NLMSG_LENGTH(0);
|
||||
|
||||
if (rtnetlink_send(&req.nh) < 0)
|
||||
goto senderror;
|
||||
return -1;
|
||||
|
||||
// if we get an error for seqnum < min_initok_nlseqnum,
|
||||
// we must exit as initialization went wrong
|
||||
|
|
@ -1640,13 +1650,8 @@ static void inittun(void)
|
|||
min_initok_rtnlseqnum = 5 + 1; // idx + if + addr + 2*addr6
|
||||
else
|
||||
min_initok_rtnlseqnum = 3 + 1; // idx + if + addr
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
senderror:
|
||||
LOG(0, 0, 0, "Error while setting up tun device: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// set up LAC UDP ports
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue