+ if(priorityinheritance)
+ logger(LOG_WARNING, "%s not supported on this platform", "PriorityInheritance");
+#endif
+
+ if(!get_config_int(lookup_config(config_tree, "MACExpire"), &macexpire))
+ macexpire = 600;
+
+ if(get_config_int(lookup_config(config_tree, "MaxTimeout"), &maxtimeout)) {
+ if(maxtimeout <= 0) {
+ logger(LOG_ERR, "Bogus maximum timeout!");
+ return false;
+ }
+ } else
+ maxtimeout = 900;
+
+ if(get_config_int(lookup_config(config_tree, "UDPRcvBuf"), &udp_rcvbuf)) {
+ if(udp_rcvbuf <= 0) {
+ logger(LOG_ERR, "UDPRcvBuf cannot be negative!");
+ return false;
+ }
+ }
+
+ if(get_config_int(lookup_config(config_tree, "UDPSndBuf"), &udp_sndbuf)) {
+ if(udp_sndbuf <= 0) {
+ logger(LOG_ERR, "UDPSndBuf cannot be negative!");
+ return false;
+ }
+ }
+
+ if(get_config_int(lookup_config(config_tree, "ReplayWindow"), &replaywin_int)) {
+ if(replaywin_int < 0) {
+ logger(LOG_ERR, "ReplayWindow cannot be negative!");
+ return false;
+ }
+ replaywin = (unsigned)replaywin_int;
+ }
+
+ if(get_config_string(lookup_config(config_tree, "AddressFamily"), &afname)) {
+ if(!strcasecmp(afname, "IPv4"))
+ addressfamily = AF_INET;
+ else if(!strcasecmp(afname, "IPv6"))
+ addressfamily = AF_INET6;
+ else if(!strcasecmp(afname, "any"))
+ addressfamily = AF_UNSPEC;
+ else {
+ logger(LOG_ERR, "Invalid address family!");
+ return false;
+ }
+ free(afname);
+ }
+
+ get_config_bool(lookup_config(config_tree, "Hostnames"), &hostnames);
+
+ /* Generate packet encryption key */
+
+ if(get_config_string
+ (lookup_config(config_tree, "Cipher"), &cipher)) {
+ if(!strcasecmp(cipher, "none")) {
+ myself->incipher = NULL;
+ } else {
+ myself->incipher = EVP_get_cipherbyname(cipher);
+
+ if(!myself->incipher) {
+ logger(LOG_ERR, "Unrecognized cipher type!");
+ return false;
+ }
+ }
+ } else
+ myself->incipher = EVP_bf_cbc();
+
+ if(myself->incipher)
+ myself->inkeylength = myself->incipher->key_len + myself->incipher->iv_len;
+ else
+ myself->inkeylength = 1;
+
+ myself->connection->outcipher = EVP_bf_ofb();
+
+ if(!get_config_int(lookup_config(config_tree, "KeyExpire"), &keylifetime))
+ keylifetime = 3600;
+
+ keyexpires = now + keylifetime;
+
+ /* Check if we want to use message authentication codes... */
+
+ if(get_config_string(lookup_config(config_tree, "Digest"), &digest)) {
+ if(!strcasecmp(digest, "none")) {
+ myself->indigest = NULL;
+ } else {
+ myself->indigest = EVP_get_digestbyname(digest);
+
+ if(!myself->indigest) {
+ logger(LOG_ERR, "Unrecognized digest type!");
+ return false;
+ }
+ }
+ } else
+ myself->indigest = EVP_sha1();
+
+ myself->connection->outdigest = EVP_sha1();
+
+ if(get_config_int(lookup_config(config_tree, "MACLength"), &myself->inmaclength)) {
+ if(myself->indigest) {
+ if(myself->inmaclength > myself->indigest->md_size) {
+ logger(LOG_ERR, "MAC length exceeds size of digest!");
+ return false;
+ } else if(myself->inmaclength < 0) {
+ logger(LOG_ERR, "Bogus MAC length!");
+ return false;
+ }
+ }
+ } else
+ myself->inmaclength = 4;
+
+ myself->connection->outmaclength = 0;
+
+ /* Compression */
+
+ if(get_config_int(lookup_config(config_tree, "Compression"), &myself->incompression)) {
+ if(myself->incompression < 0 || myself->incompression > 11) {
+ logger(LOG_ERR, "Bogus compression level!");
+ return false;
+ }
+ } else
+ myself->incompression = 0;
+
+ myself->connection->outcompression = 0;
+
+ /* Done */
+
+ myself->nexthop = myself;
+ myself->via = myself;
+ myself->status.reachable = true;
+ node_add(myself);
+
+ graph();
+
+ if(strictsubnets)
+ load_all_subnets();
+
+ /* Open device */
+
+ devops = os_devops;
+
+ if(get_config_string(lookup_config(config_tree, "DeviceType"), &type)) {
+ if(!strcasecmp(type, "dummy"))
+ devops = dummy_devops;
+ else if(!strcasecmp(type, "raw_socket"))
+ devops = raw_socket_devops;
+#ifdef ENABLE_UML
+ else if(!strcasecmp(type, "uml"))
+ devops = uml_devops;
+#endif
+#ifdef ENABLE_VDE
+ else if(!strcasecmp(type, "vde"))
+ devops = vde_devops;