Browse Source

merged edge's subnet parameter into address parameter

pull/431/head
Logan007 4 years ago
parent
commit
df869bfd3b
  1. 1
      include/n2n.h
  2. 4
      include/n2n_define.h
  3. 91
      src/edge.c

1
include/n2n.h

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

4
include/n2n_define.h

@ -89,6 +89,10 @@
#define N2N_MACNAMSIZ 18 /* AA:BB:CC:DD:EE:FF + NULL*/ #define N2N_MACNAMSIZ 18 /* AA:BB:CC:DD:EE:FF + NULL*/
#define N2N_IF_MODE_SIZE 16 /* static | dhcp */ #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_LPORT_DEFAULT 7654
#define N2N_SN_PKTBUF_SIZE 2048 #define N2N_SN_PKTBUF_SIZE 2048

91
src/edge.c

@ -45,54 +45,65 @@ int num_cap = sizeof(cap_values)/sizeof(cap_value_t);
/** Find the address and IP mode for the tuntap device. /** 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 * Fill the parts of the string into the fileds, ip_mode only if
* otherwise do not change ip_mode. Fill ip_mode with everything after the * present. All strings are NULL terminated.
* colon if it is present; or s if colon is not present.
*
* ip_add and ip_mode are NULL terminated if modified.
* *
* return 0 on success and -1 on error * return 0 on success and -1 on error
*/ */
static int scan_address(char * ip_addr, size_t addr_size, static int scan_address(char * ip_addr, size_t addr_size,
char * netmask, size_t netmask_size,
char * ip_mode, size_t mode_size, char * ip_mode, size_t mode_size,
const char * s) { char * s) {
int retval = -1; int retval = -1;
char * p; char * start;
char * end;
int bitlen = N2N_EDGE_DEFAULT_CIDR_NM;
if((NULL == s) || (NULL == ip_addr)) if((NULL == s) || (NULL == ip_addr) || (NULL == netmask)) {
{
return -1; return -1;
} }
memset(ip_addr, 0, addr_size); 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;
if(end) {
// colon is present
if(ip_mode) {
memset(ip_mode, 0, mode_size); memset(ip_mode, 0, mode_size);
end = MIN(p-s, (ssize_t)(mode_size-1)); /* ensure NULL term */ strncpy(ip_mode, start, (size_t)MIN(end - start, mode_size - 1));
strncpy(ip_mode, s, end);
strncpy(ip_addr, p+1, addr_size-1); /* ensure NULL term */
retval = 0;
} }
start = end + 1;
} else {
// colon is not present
} }
else // start now points to first address character
{ retval = 0; // we have got an address
/* colon is not present */
strncpy(ip_addr, s, addr_size-1); end = strpbrk(start, "/");
ip_addr[addr_size-1] = '\0';
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; return retval;
@ -110,11 +121,10 @@ static void help() {
#if defined(N2N_CAN_NAME_IFACE) #if defined(N2N_CAN_NAME_IFACE)
"-d <tap device> " "-d <tap device> "
#endif /* #if defined(N2N_CAN_NAME_IFACE) */ #endif /* #if defined(N2N_CAN_NAME_IFACE) */
"-a [static:|dhcp:]<tap IP address> " "-a [static:|dhcp:]<tap IP address>[/nn] "
"-c <community> " "-c <community> "
"[-k <encrypt key>]\n" "[-k <encrypt key>]\n"
" " " "
"[-s <netmask>] "
#ifndef WIN32 #ifndef WIN32
"[-u <uid> -g <gid>]" "[-u <uid> -g <gid>]"
#endif /* #ifndef WIN32 */ #endif /* #ifndef WIN32 */
@ -139,10 +149,9 @@ static void help() {
printf("-d <tap device> | tap device name\n"); printf("-d <tap device> | tap device name\n");
#endif #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("-c <community> | n2n community name the edge belongs to.\n");
printf("-k <encrypt key> | Encryption key (ASCII) - also N2N_KEY=<encrypt key>.\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("-l <supernode host:port> | Supernode IP:port\n");
printf("-i <reg_interval> | Registration interval, for NAT hole punching (default 20 seconds)\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"); 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 */ case 'a': /* IP address and mode of TUNTAP interface */
{ {
scan_address(ec->ip_addr, N2N_NETMASK_STR_SIZE, scan_address(ec->ip_addr, N2N_NETMASK_STR_SIZE,
ec->netmask, N2N_NETMASK_STR_SIZE,
ec->ip_mode, N2N_IF_MODE_SIZE, ec->ip_mode, N2N_IF_MODE_SIZE,
optargument); optargument);
break; break;
@ -475,17 +485,6 @@ static int setOption(int optkey, char *optargument, n2n_tuntap_priv_config_t *ec
break; 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': case 'S':
{ {
conf->allow_p2p = 0; conf->allow_p2p = 0;
@ -809,9 +808,9 @@ int main(int argc, char* argv[]) {
#ifdef WIN32 #ifdef WIN32
ec.tuntap_dev_name[0] = '\0'; ec.tuntap_dev_name[0] = '\0';
#else #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 #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] != '-')) { if((argc >= 2) && (argv[1][0] != '-')) {
rc = loadFromFile(argv[1], &conf, &ec); rc = loadFromFile(argv[1], &conf, &ec);

Loading…
Cancel
Save