merged edge's subnet parameter into address parameter

This commit is contained in:
Logan007 2020-09-21 13:37:06 +05:45
parent 421968ac4e
commit df869bfd3b
3 changed files with 55 additions and 53 deletions

View File

@ -257,7 +257,6 @@ typedef struct n2n_tuntap_priv_config {
dec_ip_str_t netmask;
char device_mac[N2N_MACNAMSIZ];
int mtu;
uint8_t got_s;
uint8_t daemon;
#ifndef WIN32
uid_t userid;

View File

@ -89,6 +89,10 @@
#define N2N_MACNAMSIZ 18 /* AA:BB:CC:DD:EE:FF + NULL*/
#define N2N_IF_MODE_SIZE 16 /* static | dhcp */
#define N2N_EDGE_DEFAULT_DEV_NAME "edge0"
#define N2N_EDGE_DEFAULT_NETMASK "255.255.255.0" /* default netmask for edge ip address... */
#define N2N_EDGE_DEFAULT_CIDR_NM 24 /* ... also in cidr format */
#define N2N_SN_LPORT_DEFAULT 7654
#define N2N_SN_PKTBUF_SIZE 2048

View File

@ -45,55 +45,66 @@ int num_cap = sizeof(cap_values)/sizeof(cap_value_t);
/** Find the address and IP mode for the tuntap device.
*
* s is one of these forms:
* s is of the form:
*
* <host> := <hostname> | A.B.C.D
* ["static"|"dhcp",":"] (<host>|<ip>) [/<cidr subnet mask>]
*
* <host> | static:<host> | dhcp:<host>
* for example static:192.168.8.5/24
*
* If the mode is present (colon required) then fill ip_mode with that value
* otherwise do not change ip_mode. Fill ip_mode with everything after the
* colon if it is present; or s if colon is not present.
*
* ip_add and ip_mode are NULL terminated if modified.
* Fill the parts of the string into the fileds, ip_mode only if
* present. All strings are NULL terminated.
*
* return 0 on success and -1 on error
*/
static int scan_address(char * ip_addr, size_t addr_size,
char * netmask, size_t netmask_size,
char * ip_mode, size_t mode_size,
const char * s) {
int retval = -1;
char * p;
char * s) {
if((NULL == s) || (NULL == ip_addr))
{
return -1;
}
int retval = -1;
char * start;
char * end;
int bitlen = N2N_EDGE_DEFAULT_CIDR_NM;
if((NULL == s) || (NULL == ip_addr) || (NULL == netmask)) {
return -1;
}
memset(ip_addr, 0, addr_size);
memset(netmask, 0, netmask_size);
p = strpbrk(s, ":");
start = s;
end = strpbrk(s, ":");
if(p)
{
/* colon is present */
if(ip_mode)
{
size_t end=0;
memset(ip_mode, 0, mode_size);
end = MIN(p-s, (ssize_t)(mode_size-1)); /* ensure NULL term */
strncpy(ip_mode, s, end);
strncpy(ip_addr, p+1, addr_size-1); /* ensure NULL term */
retval = 0;
}
}
else
{
/* colon is not present */
strncpy(ip_addr, s, addr_size-1);
ip_addr[addr_size-1] = '\0';
if(end) {
// colon is present
if(ip_mode) {
memset(ip_mode, 0, mode_size);
strncpy(ip_mode, start, (size_t)MIN(end - start, mode_size - 1));
}
start = end + 1;
} else {
// colon is not present
}
// start now points to first address character
retval = 0; // we have got an address
end = strpbrk(start, "/");
if(!end)
// no slash present -- default end
end = s + strlen(s);
strncpy(ip_addr, start, (size_t)MIN(end - start, addr_size - 1)); // ensure NULL term
if(end) {
// slash is present
// now, handle the sub-network address
sscanf(end + 1, "%u", &bitlen);
bitlen = htobe32(bitlen2mask(bitlen));
inet_ntop(AF_INET, &bitlen, netmask, netmask_size);
}
return retval;
}
@ -110,11 +121,10 @@ static void help() {
#if defined(N2N_CAN_NAME_IFACE)
"-d <tap device> "
#endif /* #if defined(N2N_CAN_NAME_IFACE) */
"-a [static:|dhcp:]<tap IP address> "
"-a [static:|dhcp:]<tap IP address>[/nn] "
"-c <community> "
"[-k <encrypt key>]\n"
" "
"[-s <netmask>] "
#ifndef WIN32
"[-u <uid> -g <gid>]"
#endif /* #ifndef WIN32 */
@ -139,10 +149,9 @@ static void help() {
printf("-d <tap device> | tap device name\n");
#endif
printf("-a <mode:address> | Set interface address. For DHCP use '-r -a dhcp:0.0.0.0'\n");
printf("-a [mode:]<address>[/nn] | Interface address and optional subnet (cidr, default /24). For DHCP use '-r -a dhcp:0.0.0.0'\n");
printf("-c <community> | n2n community name the edge belongs to.\n");
printf("-k <encrypt key> | Encryption key (ASCII) - also N2N_KEY=<encrypt key>.\n");
printf("-s <netmask> | Edge interface netmask in dotted decimal notation (255.255.255.0).\n");
printf("-l <supernode host:port> | Supernode IP:port\n");
printf("-i <reg_interval> | Registration interval, for NAT hole punching (default 20 seconds)\n");
printf("-L <reg_ttl> | TTL for registration packet when UDP NAT hole punching through supernode (default 0 for not set )\n");
@ -273,6 +282,7 @@ static int setOption(int optkey, char *optargument, n2n_tuntap_priv_config_t *ec
case 'a': /* IP address and mode of TUNTAP interface */
{
scan_address(ec->ip_addr, N2N_NETMASK_STR_SIZE,
ec->netmask, N2N_NETMASK_STR_SIZE,
ec->ip_mode, N2N_IF_MODE_SIZE,
optargument);
break;
@ -475,17 +485,6 @@ static int setOption(int optkey, char *optargument, n2n_tuntap_priv_config_t *ec
break;
}
case 's': /* Subnet Mask */
{
if(0 != ec->got_s) {
traceEvent(TRACE_WARNING, "Multiple subnet masks supplied");
}
strncpy(ec->netmask, optargument, N2N_NETMASK_STR_SIZE);
ec->netmask[N2N_NETMASK_STR_SIZE - 1] = '\0';
ec->got_s = 1;
break;
}
case 'S':
{
conf->allow_p2p = 0;
@ -809,9 +808,9 @@ int main(int argc, char* argv[]) {
#ifdef WIN32
ec.tuntap_dev_name[0] = '\0';
#else
snprintf(ec.tuntap_dev_name, sizeof(ec.tuntap_dev_name), "edge0");
snprintf(ec.tuntap_dev_name, sizeof(ec.tuntap_dev_name), N2N_EDGE_DEFAULT_DEV_NAME);
#endif
snprintf(ec.netmask, sizeof(ec.netmask), "255.255.255.0");
snprintf(ec.netmask, sizeof(ec.netmask), N2N_EDGE_DEFAULT_NETMASK);
if((argc >= 2) && (argv[1][0] != '-')) {
rc = loadFromFile(argv[1], &conf, &ec);