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
185
l2tpns.c
185
l2tpns.c
|
|
@ -253,6 +253,7 @@ struct Tstats *_statistics = NULL;
|
||||||
struct Tringbuffer *ringbuffer = NULL;
|
struct Tringbuffer *ringbuffer = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int setupif(int ifidx, uint32_t mru, int config_addr);
|
||||||
static ssize_t rtnetlink_send(struct nlmsghdr *nh);
|
static ssize_t rtnetlink_send(struct nlmsghdr *nh);
|
||||||
static ssize_t genetlink_send(struct nlmsghdr *nh);
|
static ssize_t genetlink_send(struct nlmsghdr *nh);
|
||||||
static ssize_t genetlink_recv(void *buf, ssize_t len);
|
static ssize_t genetlink_recv(void *buf, ssize_t len);
|
||||||
|
|
@ -1510,41 +1511,51 @@ static void inittun(void)
|
||||||
LOG(0, 0, 0, "Can't get tun interface index\n");
|
LOG(0, 0, 0, "Can't get tun interface index\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
if (setupif(tunidx, MRU, 1) < 0)
|
||||||
{
|
{
|
||||||
struct {
|
LOG(0, 0, 0, "Error while setting up tun device: %s\n", strerror(errno));
|
||||||
// interface setting
|
exit(1);
|
||||||
struct nlmsghdr nh;
|
}
|
||||||
union {
|
}
|
||||||
struct ifinfomsg ifinfo;
|
|
||||||
struct ifaddrmsg ifaddr;
|
|
||||||
} ifmsg;
|
|
||||||
char rtdata[32]; // 32 should be enough
|
|
||||||
} req;
|
|
||||||
uint32_t txqlen, mtu;
|
|
||||||
in_addr_t ip;
|
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
//
|
||||||
|
// 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;
|
||||||
|
union {
|
||||||
|
struct ifinfomsg ifinfo;
|
||||||
|
struct ifaddrmsg ifaddr;
|
||||||
|
} ifmsg;
|
||||||
|
char rtdata[32]; // 32 should be enough
|
||||||
|
} req;
|
||||||
|
uint32_t txqlen;
|
||||||
|
in_addr_t ip;
|
||||||
|
|
||||||
req.nh.nlmsg_type = RTM_NEWLINK;
|
memset(&req, 0, sizeof(req));
|
||||||
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_MULTI;
|
|
||||||
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifmsg.ifinfo));
|
|
||||||
|
|
||||||
req.ifmsg.ifinfo.ifi_family = AF_UNSPEC;
|
req.nh.nlmsg_type = RTM_NEWLINK;
|
||||||
req.ifmsg.ifinfo.ifi_index = tunidx;
|
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_MULTI;
|
||||||
req.ifmsg.ifinfo.ifi_flags |= IFF_UP; // set interface up
|
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifmsg.ifinfo));
|
||||||
req.ifmsg.ifinfo.ifi_change = IFF_UP; // only change this flag
|
|
||||||
|
|
||||||
/* Bump up the qlen to deal with bursts from the network */
|
req.ifmsg.ifinfo.ifi_family = AF_UNSPEC;
|
||||||
txqlen = 1000;
|
req.ifmsg.ifinfo.ifi_index = ifidx;
|
||||||
rtnetlink_addattr(&req.nh, IFLA_TXQLEN, &txqlen, sizeof(txqlen));
|
req.ifmsg.ifinfo.ifi_flags |= IFF_UP; // set interface up
|
||||||
/* set MTU to modem MRU */
|
req.ifmsg.ifinfo.ifi_change = IFF_UP; // only change this flag
|
||||||
mtu = MRU;
|
|
||||||
rtnetlink_addattr(&req.nh, IFLA_MTU, &mtu, sizeof(mtu));
|
|
||||||
|
|
||||||
if (rtnetlink_send(&req.nh) < 0)
|
/* Bump up the qlen to deal with bursts from the network */
|
||||||
goto senderror;
|
txqlen = 1000;
|
||||||
|
rtnetlink_addattr(&req.nh, IFLA_TXQLEN, &txqlen, sizeof(txqlen));
|
||||||
|
/* set MTU to modem MRU */
|
||||||
|
rtnetlink_addattr(&req.nh, IFLA_MTU, &mru, sizeof(mru));
|
||||||
|
|
||||||
|
if (rtnetlink_send(&req.nh) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (config_addr)
|
||||||
|
{
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
|
|
||||||
req.nh.nlmsg_type = RTM_NEWADDR;
|
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_family = AF_INET;
|
||||||
req.ifmsg.ifaddr.ifa_prefixlen = 32;
|
req.ifmsg.ifaddr.ifa_prefixlen = 32;
|
||||||
req.ifmsg.ifaddr.ifa_scope = RT_SCOPE_UNIVERSE;
|
req.ifmsg.ifaddr.ifa_scope = RT_SCOPE_UNIVERSE;
|
||||||
req.ifmsg.ifaddr.ifa_index = tunidx;
|
req.ifmsg.ifaddr.ifa_index = ifidx;
|
||||||
|
|
||||||
if (config->nbmultiaddress > 1)
|
if (config->nbmultiaddress > 1)
|
||||||
{
|
{
|
||||||
|
|
@ -1564,7 +1575,7 @@ static void inittun(void)
|
||||||
ip = config->iftun_n_address[i];
|
ip = config->iftun_n_address[i];
|
||||||
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip, sizeof(ip));
|
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip, sizeof(ip));
|
||||||
if (rtnetlink_send(&req.nh) < 0)
|
if (rtnetlink_send(&req.nh) < 0)
|
||||||
goto senderror;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -1576,77 +1587,71 @@ static void inittun(void)
|
||||||
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip, sizeof(ip));
|
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip, sizeof(ip));
|
||||||
|
|
||||||
if (rtnetlink_send(&req.nh) < 0)
|
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]) {
|
||||||
// Only setup IPv6 on the tun device if we have a configured prefix
|
struct in6_addr ip6;
|
||||||
if (config->ipv6_prefix.s6_addr[0]) {
|
|
||||||
struct in6_addr ip6;
|
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
|
||||||
|
|
||||||
req.nh.nlmsg_type = RTM_NEWADDR;
|
|
||||||
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE | NLM_F_MULTI;
|
|
||||||
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifmsg.ifaddr));
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// Link local address is FE80::1
|
|
||||||
memset(&ip6, 0, sizeof(ip6));
|
|
||||||
ip6.s6_addr[0] = 0xFE;
|
|
||||||
ip6.s6_addr[1] = 0x80;
|
|
||||||
ip6.s6_addr[15] = 1;
|
|
||||||
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip6, sizeof(ip6));
|
|
||||||
|
|
||||||
if (rtnetlink_send(&req.nh) < 0)
|
|
||||||
goto senderror;
|
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
|
||||||
|
|
||||||
req.nh.nlmsg_type = RTM_NEWADDR;
|
|
||||||
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE | NLM_F_MULTI;
|
|
||||||
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifmsg.ifaddr));
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// Global address is prefix::1
|
|
||||||
ip6 = config->ipv6_prefix;
|
|
||||||
ip6.s6_addr[15] = 1;
|
|
||||||
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip6, sizeof(ip6));
|
|
||||||
|
|
||||||
if (rtnetlink_send(&req.nh) < 0)
|
|
||||||
goto senderror;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
|
|
||||||
req.nh.nlmsg_type = NLMSG_DONE;
|
req.nh.nlmsg_type = RTM_NEWADDR;
|
||||||
req.nh.nlmsg_len = NLMSG_LENGTH(0);
|
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE | NLM_F_MULTI;
|
||||||
|
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifmsg.ifaddr));
|
||||||
|
|
||||||
|
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 = ifidx;
|
||||||
|
|
||||||
|
// Link local address is FE80::1
|
||||||
|
memset(&ip6, 0, sizeof(ip6));
|
||||||
|
ip6.s6_addr[0] = 0xFE;
|
||||||
|
ip6.s6_addr[1] = 0x80;
|
||||||
|
ip6.s6_addr[15] = 1;
|
||||||
|
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip6, sizeof(ip6));
|
||||||
|
|
||||||
if (rtnetlink_send(&req.nh) < 0)
|
if (rtnetlink_send(&req.nh) < 0)
|
||||||
goto senderror;
|
return -1;
|
||||||
|
|
||||||
// if we get an error for seqnum < min_initok_nlseqnum,
|
memset(&req, 0, sizeof(req));
|
||||||
// we must exit as initialization went wrong
|
|
||||||
if (config->ipv6_prefix.s6_addr[0])
|
req.nh.nlmsg_type = RTM_NEWADDR;
|
||||||
min_initok_rtnlseqnum = 5 + 1; // idx + if + addr + 2*addr6
|
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE | NLM_F_MULTI;
|
||||||
else
|
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.ifmsg.ifaddr));
|
||||||
min_initok_rtnlseqnum = 3 + 1; // idx + if + addr
|
|
||||||
|
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 = ifidx;
|
||||||
|
|
||||||
|
// Global address is prefix::1
|
||||||
|
ip6 = config->ipv6_prefix;
|
||||||
|
ip6.s6_addr[15] = 1;
|
||||||
|
rtnetlink_addattr(&req.nh, IFA_LOCAL, &ip6, sizeof(ip6));
|
||||||
|
|
||||||
|
if (rtnetlink_send(&req.nh) < 0)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
memset(&req, 0, sizeof(req));
|
||||||
|
|
||||||
senderror:
|
req.nh.nlmsg_type = NLMSG_DONE;
|
||||||
LOG(0, 0, 0, "Error while setting up tun device: %s\n", strerror(errno));
|
req.nh.nlmsg_len = NLMSG_LENGTH(0);
|
||||||
exit(1);
|
|
||||||
|
if (rtnetlink_send(&req.nh) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// if we get an error for seqnum < min_initok_nlseqnum,
|
||||||
|
// we must exit as initialization went wrong
|
||||||
|
if (config->ipv6_prefix.s6_addr[0])
|
||||||
|
min_initok_rtnlseqnum = 5 + 1; // idx + if + addr + 2*addr6
|
||||||
|
else
|
||||||
|
min_initok_rtnlseqnum = 3 + 1; // idx + if + addr
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set up LAC UDP ports
|
// set up LAC UDP ports
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue