Esempio n. 1
0
void garden_patricia_reload() {
  if (_options.patricia) {
    garden_patricia_load_list(&dhcp->ptree,
			      _options.pass_throughs,
			      _options.num_pass_throughs);
#ifdef ENABLE_AUTHEDALLOWED
    garden_patricia_load_list(&dhcp->ptree_authed,
			      _options.authed_pass_throughs,
			      _options.num_authed_pass_throughs);
#endif
  }
}
Esempio n. 2
0
void garden_patricia_reload()
{
	if (_options.patricia) {
		garden_patricia_load_list(&dhcp->ptree,
					  _options.pass_throughs,
					  _options.num_pass_throughs);
	}
}
Esempio n. 3
0
int loadstatus()
{
	char filedest[512];
	FILE *file;
	char c;

	struct dhcp_conn_t dhcpconn;
	struct app_conn_t appconn;

	time_t r_wall, r_rt, r_rtoffset;
	time_t wall, rt, rtoffset;

	has_loaded = 1;

	if (!_options.usestatusfile)
		return 1;

	statedir_file(filedest, sizeof(filedest), _options.usestatusfile, 0);

	log_dbg("Loading file %s", filedest);

	file = fopen(filedest, "r");
	if (!file) {
		log_err(errno, "could not open file %s", filedest);
		return -1;
	}

	while ((c = fgetc(file)) != MARK_START) {
		if (c == EOF) {
			log_err(errno, "end of file");
			fclose(file);
			return -1;
		}
	}

	time(&wall);
	if (fread(&r_wall, sizeof(time_t), 1, file) != 1) {
		log_err(errno, "bad binary file");
		if (c == EOF) {
			fclose(file);
			return -1;
		}
	}

	rt = mainclock_tick();
	if (fread(&r_rt, sizeof(time_t), 1, file) != 1) {
		log_err(errno, "bad binary file");
		if (c == EOF) {
			fclose(file);
			return -1;
		}
	}

	if ((c = fgetc(file)) != MARK_START) {
		log_err(errno, "bad binary file");
		fclose(file);
		return -1;
	}

	rtoffset = wall - rt;
	log_dbg("now: wall = %d, rt = %d, wall at rt=0 %d",
		(int)wall, (int)rt, (int)rtoffset);

	r_rtoffset = r_wall - r_rt;
	log_dbg("file: wall = %d, rt = %d, wall at rt=0 %d",
		(int)r_wall, (int)r_rt, (int)r_rtoffset);

	while (fread(&dhcpconn, sizeof(struct dhcp_conn_t), 1, file) == 1) {
		struct dhcp_conn_t *conn = 0;
		struct ippoolm_t *newipm = 0;
		int n;

		/* todo: read a md5 checksum or magic token */

		if ((c = fgetc(file)) != MARK_NEXT) {
			log_err(errno, "bad binary file");
			fclose(file);
			return -1;
		}

		if (dhcp_hashget(dhcp, &conn, dhcpconn.hismac)) {

			log_info
			    ("Loading dhcp connection %.2X-%.2X-%.2X-%.2X-%.2X-%.2X",
			     dhcpconn.hismac[0], dhcpconn.hismac[1],
			     dhcpconn.hismac[2], dhcpconn.hismac[3],
			     dhcpconn.hismac[4], dhcpconn.hismac[5]);

			/* not already known */
			dhcp_lnkconn(dhcp, &conn);

			/* set/copy all the pointers */
			dhcpconn.nexthash = conn->nexthash;
			dhcpconn.next = conn->next;
			dhcpconn.prev = conn->prev;
			dhcpconn.parent = dhcp;

			dhcpconn.is_reserved = 0;	/* never a reserved ip if added here */

			/*
			 * Fix time_t values:
			 *  lasttime
			 */

#define localizetime(t) \
      /* to it's local real time */ \
      t = r_rtoffset + t; \
      /* now to our local rt offset */ \
      t = t - rtoffset; \
      if (t < 0) t = 0;

			localizetime(dhcpconn.lasttime);

			/* initialize dhcp_conn_t */
			memcpy(conn, &dhcpconn, sizeof(struct dhcp_conn_t));

			for (n = 0; n < DHCP_DNAT_MAX; n++) {
				memset(conn->dnat[n].mac, 0, PKT_ETH_ALEN);
			}

			log_dbg("checking IP %s", inet_ntoa(dhcpconn.hisip));

			/* add into ippool */
			if (ippool_getip(ippool, &newipm, &dhcpconn.hisip)) {
				if (ippool_newip
				    (ippool, &newipm, &dhcpconn.hisip, 1)) {
					if (ippool_newip
					    (ippool, &newipm, &dhcpconn.hisip,
					     0)) {
						log_err(0,
							"Failed to allocate either static or dynamic IP address");
						conn->hisip.s_addr = 0;
					}
				}
			}

			dhcp_hashadd(dhcp, conn);

			if (conn->peer) {
				conn->peer = 0;

				if (fread
				    (&appconn, sizeof(struct app_conn_t), 1,
				     file) == 1) {
					struct app_conn_t *aconn = 0;

					if ((c = fgetc(file)) != MARK_NEXT) {
						log_err(errno,
							"bad binary file");
						fclose(file);
						return -1;
					}

					if (chilli_new_conn(&aconn) == 0) {
						/* set/copy all the pointers/internals */
						appconn.unit = aconn->unit;
						appconn.next = aconn->next;
						appconn.prev = aconn->prev;
						appconn.uplink = newipm;
						appconn.dnlink = conn;

						/*
						 * Fix time_t values:
						 *  start_time, interim_time,
						 *  last_sent_time, last_time,
						 *  uamtime
						 */
						localizetime(appconn.s_state.
							     start_time);
						localizetime(appconn.s_state.
							     interim_time);
						localizetime(appconn.s_state.
							     last_sent_time);
						localizetime(appconn.s_state.
							     last_time);
						localizetime(appconn.s_state.
							     uamtime);

						/* initialize app_conn_t */
						memcpy(aconn, &appconn,
						       sizeof(struct
							      app_conn_t));
						conn->peer = aconn;

						if (newipm) {
							newipm->peer = aconn;

#ifdef ENABLE_UAMANYIP
							if (aconn->natip.s_addr)
								chilli_assign_snat
								    (aconn, 1);
#endif

							dhcp_set_addrs(conn,
								       &newipm->
								       addr,
								       &_options.
								       mask,
								       &aconn->
								       ourip,
								       &aconn->
								       mask,
								       &_options.
								       dns1,
								       &_options.
								       dns2);
						}
#if defined(ENABLE_SESSGARDEN) && defined(HAVE_PATRICIA)
						if (aconn->s_params.
						    pass_through_count) {
							garden_patricia_load_list
							    (&aconn->ptree,
							     aconn->s_params.
							     pass_throughs,
							     aconn->s_params.
							     pass_through_count);
						}
#endif
					}

					/* todo: read a md5 checksum or magic token */
				} else {
					log_err(errno,
						"Problem loading state file %s",
						filedest);
					break;
				}
			}

		} else {

			log_info
			    ("Known dhcp connection %.2X-%.2X-%.2X-%.2X-%.2X-%.2X",
			     dhcpconn.hismac[0], dhcpconn.hismac[1],
			     dhcpconn.hismac[2], dhcpconn.hismac[3],
			     dhcpconn.hismac[4], dhcpconn.hismac[5]);

			conn->authstate = dhcpconn.authstate;

			if (dhcpconn.peer) {

				log_info("Reading appconn (peer)");

				if (fread
				    (&appconn, sizeof(struct app_conn_t), 1,
				     file) == 1) {

					if ((c = fgetc(file)) != MARK_NEXT) {
						log_err(errno,
							"bad binary file");
						fclose(file);
						return -1;
					}

					if (conn->peer) {
						/*
						 * Already have an appconn.
						 */
						struct app_conn_t *aconn =
						    (struct app_conn_t *)conn->
						    peer;

						log_info
						    ("Overwriting existing appconn %d",
						     appconn.s_state.
						     authenticated);

						memcpy(&aconn->s_params,
						       &appconn.s_params,
						       sizeof(struct
							      session_params));
						memcpy(&aconn->s_state,
						       &appconn.s_state,
						       sizeof(struct
							      session_state));

					} else {
						/*
						 * No peer (appconn), then create it just as above.
						 */
						struct app_conn_t *aconn = 0;

						log_info
						    ("Creating new appconn (peer)");

						if (ippool_getip
						    (ippool, &newipm,
						     &conn->hisip)) {
							if (ippool_newip
							    (ippool, &newipm,
							     &conn->hisip, 1)) {
								if (ippool_newip
								    (ippool,
								     &newipm,
								     &conn->
								     hisip,
								     0)) {
									log_err
									    (0,
									     "Failed to allocate either static or dynamic IP address");
									fclose
									    (file);
									return
									    -1;
								}
							}
						}

						if (chilli_new_conn(&aconn) ==
						    0) {
							/* set/copy all the pointers/internals */
							appconn.unit =
							    aconn->unit;
							appconn.next =
							    aconn->next;
							appconn.prev =
							    aconn->prev;
							appconn.uplink = newipm;
							appconn.dnlink = conn;

							/* initialize app_conn_t */
							memcpy(aconn, &appconn,
							       sizeof(struct
								      app_conn_t));
							conn->peer = aconn;
							newipm->peer = aconn;

#ifdef ENABLE_UAMANYIP
							if (appconn.natip.
							    s_addr)
								chilli_assign_snat
								    (aconn, 1);
#endif

							dhcp_set_addrs(conn,
								       &newipm->
								       addr,
								       &_options.
								       mask,
								       &aconn->
								       ourip,
								       &aconn->
								       mask,
								       &_options.
								       dns1,
								       &_options.
								       dns2);
						}
					}
				}
			}
		}
	}

	fclose(file);
	printstatus();
	return 0;
}