Exemple #1
0
void send_Query_ACK( dhcp_message *message ) {
	u_int32_t	lease_time;

	message->out_pack.op    = BOOTREPLY;
	message->out_pack.htype = ETH_10MB;
	message->out_pack.hlen  = ETH_10MB_LEN;
	message->out_pack.hops  = message->in_pack.hops;
	message->out_pack.flags = message->in_pack.flags;
	message->out_pack.xid   = message->in_pack.xid;

	message->out_pack.ciaddr = message->in_pack.ciaddr;
	message->out_pack.yiaddr = message->ipaddr;
	message->out_pack.siaddr = message->server_ip;
	message->out_pack.giaddr = message->in_pack.giaddr;
	message->out_pack.cookie = DHCP_MAGIC;

	memcpy( message->out_pack.macaddr, message->macaddr, 6 );

	if (message->cpe_type == CPE_DYNAMIC) lease_time = htonl( (u_int32_t) message->lease_time );
	if (message->cpe_type == CPE_STATIC) lease_time = htonl( 3600 * 12 );  // give em 12 hours

	initOpt( message );
	addOpt( 0x35, 0x01, "\x05" );
	addOpt( 0x33, 0x04, (char *) &lease_time );
	lease_time = ntohl( lease_time ) - 60;
	if (lease_time < 5) lease_time = 5;
	lease_time = htonl( lease_time );
	addOpt( 0x3A, 0x04, (char *) &lease_time );
	addOpt( 0x3B, 0x04, (char *) &lease_time );
	if( my_findAgent( message ) ) {
		addOpt( 0x52, message->in_opts.agent_mac_len, NULL );
		addOpt( 0x01, message->in_opts.agentid_len,   (char *) message->in_opts.agentid );
		addOpt( 0x02, message->in_opts.modem_mac_len, (char *) message->in_opts.modem_mac );
	}
	addOpt( 0xff, 0x00, NULL );

	my_dhcplog( DHCP_QUERY_ACK, message );

	my_UpdateTime( message );

	sendPacket( message );
}
void NonRigid::setMesh(Mesh *mesh_data)
{
    this->mesh_data = mesh_data;
    lamd_arap = 10;
    grad_max_iter = 25;
    grad_step = 0.01;

    std::clock_t begin;
    std::clock_t end;
    begin = std::clock();

    buildAdjList();

    end = std::clock();
    std::cout<<"Elapsed time: "<<double(end-begin)/CLOCKS_PER_SEC<<"\n";

    // init mesh data vector to current position
    vtkSmartPointer<vtkMatrix4x4> trans_mat = vtkSmartPointer<vtkMatrix4x4>::New();
    mesh_data->getTransform()->GetMatrix(trans_mat);
    int meshNum = mesh_data->getMeshData()->GetNumberOfPoints();
    temp_mesh_vec.clear();
    for (size_t i = 0; i < meshNum; ++i) {
        double* temp = mesh_data->getMeshData()->GetPoint(i);
        temp_mesh_vec.push_back(temp[0]);
        temp_mesh_vec.push_back(temp[1]);
        temp_mesh_vec.push_back(temp[2]);
    }

    setUserTrans(trans_mat);

    begin = std::clock();

    initOpt();

    end = std::clock();
    std::cout<<"Elapsed time: "<<double(end-begin)/CLOCKS_PER_SEC<<"\n";

}
Exemple #3
0
void send_NAK( dhcp_message *message ) {
	message->out_pack.op    = BOOTREPLY;
	message->out_pack.htype = ETH_10MB;
	message->out_pack.hlen  = ETH_10MB_LEN;
	message->out_pack.hops  = message->in_pack.hops;
	message->out_pack.flags = message->in_pack.flags;
	message->out_pack.xid   = message->in_pack.xid;

	message->out_pack.ciaddr = message->in_pack.ciaddr;
	message->out_pack.siaddr = message->server_ip;
	message->out_pack.giaddr = message->in_pack.giaddr;
	message->out_pack.cookie = DHCP_MAGIC;

	memcpy( message->out_pack.macaddr, message->macaddr, 6 );

	initOpt( message );
	addOpt( 0x35, 0x01, "\x06" );  /* DHCP NAK */
	addOpt( 0x36, 0x04, (char *) &message->server_ip );
	addOpt( 0xff, 0x00, NULL );

	my_dhcplog( DHCP_NAK, message );

	sendPacket( message );
}
Exemple #4
0
int send_positive_message( dhcp_message *message, int mess_type ) {
	static char	*newip_pref = NULL;
	u_int32_t	lease_time;
	ConfigNets	*netopts;

	/* check SQL table for this MAC address */
	my_findMAC( message );

	if (message->lease_type == LEASE_NOT_FOUND && message->in_opts.docsis_modem == 1 ) {
		my_syslog(LOG_INFO, "NAK -- unknown docsis modem: %s : %s ", message->s_macaddr,message->in_opts.vsi_model );
		// my_findMAC_CMUNKNOWN( message );
		send_NAK( message );
		return 1;
	}

	if (message->lease_type == LEASE_NOT_FOUND && message->in_opts.docsis_modem == 2 ) {
		my_syslog(LOG_INFO, "NAK -- unknown mta from modem: %s ", message->s_modem_macaddr);
		// message->lease_type = LEASE_REJECT;
		send_NAK( message );
		return 1;
	}

	if (message->lease_type == LEASE_REJECT) { return 0; }

	if (message->lease_type == LEASE_CPE &&
	    message->cpe_type == CPE_DYNAMIC &&
	    message->lockip == 0 &&
	    message->lease_time < 60 ) {
		// Your Lease has expired. You get a new IP!
		my_DeleteLease( message );
		message->lease_type = LEASE_NOT_FOUND;
	}

	if ( Verify_Vlan( message ) ) {
		if (message->lease_type == LEASE_CM ) {
			my_syslog(LOG_WARNING,
								"NEW CM GIaddr mismatch (the CM moved) gi %s ip %s vlan %d",
								message->in_giaddr, message->s_ipaddr, message->vlan );
			message->ipaddr = message->b_ipaddr = 0;
			message->s_ipaddr[0] = 0;
		}
    if (message->lease_type == LEASE_MTA ) {
      my_syslog(LOG_WARNING,
	              "NEW MTA GIaddr mismatch (the CM moved) gi %s ip %s vlan %d",
	              message->in_giaddr, message->s_ipaddr, message->vlan );
      message->ipaddr = message->b_ipaddr = 0;
      message->s_ipaddr[0] = 0;
    }
		if (message->lease_type == LEASE_CPE ) {
			my_syslog(LOG_WARNING, "NEW -- GIaddr does not match vlan - gi %s ip %s vlan %d",
				message->in_giaddr, message->s_ipaddr, message->vlan );
			if (message->cpe_type == CPE_STATIC) {
				my_DeleteLease( message );
				message->lease_type = LEASE_NOT_FOUND;
			} else {
				// if message->cpe_type == CPE_DYNAMIC
				my_DeleteLease( message ); /* added 29.11.2014 */
				message->lease_type = LEASE_NOAUTH;
			}
		}
	}

	if (message->lease_type == LEASE_NOT_FOUND && message->in_opts.agent_mac_len == 0) {
		my_syslog(LOG_WARNING, "NAK -- CPE asking for new IP directly - mac %s",
			message->s_macaddr );
		send_NAK( message );
		return 0;
	}

	if (newip_pref == NULL) newip_pref = GetConfigVar( "assign-new-ip" );

	if (message->lease_type == LEASE_NOT_FOUND) {
		if (*newip_pref == 'n') return 0;

		my_getNewIP_CPE( message );

		if (message->ipaddr == 0) {
			send_NAK( message );
			return 1;
		}
		if (message->lease_type == LEASE_CPE) {
			if (message->cpe_type == CPE_STATIC) {
				my_syslog(LOG_INFO, "NEW STATIC -- mac %s ip %s vlan %d",
					message->s_macaddr, message->s_ipaddr, message->vlan );
			}
			if (message->cpe_type == CPE_DYNAMIC) {
				my_syslog(LOG_INFO, "NEW DYNAMIC -- mac %s ip %s vlan %d",
					message->s_macaddr, message->s_ipaddr, message->vlan );
			}
		}
		if (message->lease_type == LEASE_NOAUTH) {
			my_syslog(LOG_INFO, "NEW NOAUTH -- mac %s ip %s vlan %d",
				message->s_macaddr, message->s_ipaddr, message->vlan );
                	send_NAK( message ); /* added 29.11.2014 */
                	return 1;
		}
	}

	if ( my_Get_Net( message ) ) {
		my_syslog(LOG_WARNING, "NAK -- no subnet for ip %s mac %s vlan %d, lease_type %d",
			message->s_ipaddr, message->s_macaddr, message->vlan, message->lease_type );
		send_NAK( message );
		return 1;
	}

	if (message->in_opts.request_addr != 0 ) {
		if (message->ipaddr != message->in_opts.request_addr ) {
			my_syslog(LOG_ERR, "WARN -- bad ip requested %s mac %s real-ip %s",
				message->in_opts.s_request_addr, message->s_macaddr, message->s_ipaddr );
		}
	}

	netopts = Get_Net_Opts( message->netptr );

	message->out_pack.op    = BOOTREPLY;
	message->out_pack.htype = ETH_10MB;
	message->out_pack.hlen  = ETH_10MB_LEN;
	message->out_pack.hops  = message->in_pack.hops;
	message->out_pack.flags = message->in_pack.flags;
	message->out_pack.xid   = message->in_pack.xid;

	message->out_pack.ciaddr = message->in_pack.ciaddr;
	message->out_pack.yiaddr = message->ipaddr;
	message->out_pack.siaddr = message->server_ip;
	message->out_pack.giaddr = message->in_pack.giaddr;
	message->out_pack.cookie = DHCP_MAGIC;

	memcpy( message->out_pack.macaddr, message->macaddr, 6 );

	initOpt( message );

	if (mess_type == DHCP_OFFER) {
		addOpt( 0x35, 0x01, "\x02");
	}
	if (mess_type == DHCP_ACK) {
		addOpt( 0x35, 0x01, "\x05");
	}

	// subnet mask
	addOpt( 0x01, 0x04, (char *) &(netopts->mask) );

	// gateway
	addOpt( 0x03, 0x04, (char *) &(netopts->gateway) );

	// Broadcast Address
	addOpt( 0x1c, 0x04, (char *) &(netopts->broadcast) );

	// Lease Times
        message->lease_time = netopts->lease_time;
        lease_time = htonl( message->lease_time );
        addOpt( 0x33, 0x04, (char *) &lease_time );
        lease_time = htonl( message->lease_time / 2 );
        addOpt( 0x3A, 0x04, (char *) &lease_time );
        lease_time = htonl( message->lease_time / 100 * 87.5 );
        addOpt( 0x3B, 0x04, (char *) &lease_time );


	addBigOpt( my_Get_Opt( 1, message->b_macaddr ) );
	addBigOpt( my_Get_Opt( message->opt, 0 ) );
	if (netopts->opt1 != message->opt)
		addBigOpt( my_Get_Opt( netopts->opt1, 0 ) );
	if (netopts->opt2 != message->opt)
		addBigOpt( my_Get_Opt( netopts->opt2, 0 ) );
	if (netopts->opt3 != message->opt)
		addBigOpt( my_Get_Opt( netopts->opt3, 0 ) );

	/* Config File Name */
	if (message->cfname != NULL && message->cfname[0] != 0) {
		strncpy( message->out_pack.file, message->cfname, 127 );
		addOpt( 0x43, strlen( message->out_pack.file ), message->cfname );
	} else {
		char	*cf = Lookup_ConfigOptsMacs(message,0x43);
		if (cf != NULL)
			strncpy( message->out_pack.file, cf, 127 );
	}

	/* Add Terminator */
	addOpt( 0xff, 0x00, NULL );

	my_dhcplog( mess_type, message );

	sendPacket( message );

	// if (mess_type == DHCP_OFFER &&
	if (message->lease_type == LEASE_CM) {
		// Update AgentID of cablemodem
		my_UpdateAgent( message );
	}
        if (message->lease_type == LEASE_MTA) {
                // Update AgentID of cablemodem
                my_UpdateAgent( message );
        }

	if (message->lease_type == LEASE_UNKNOWN) {
		// Update AgentID of cablemodem
		my_UpdateAgent( message );
	}

	/* if a customer pc, update the leases table, if a cable modem dont bother */
	if (message->lease_type == LEASE_CPE || message->lease_type == LEASE_NOAUTH ) {
		my_UpdateLease( message );
	}
	return 1;
}
Exemple #5
0
void OptCG::optimize()
//------------------------------------------------------------------------
// Nonlinear Preconditioned Conjugate Gradient
// 
// Given a nonlinear operator objfcn find the minimizer using a
// nonlinear conjugate gradient method
// This version uses the Polak-Ribiere formula.
// and a line search routine due to More and Thuente as implemented
// in the routines mcsrch and mcstep
//
// Notes: The parameters ftol and gtol should be set so that
//        0 < ftol < gtol < 0.5
//        Default values: ftol = 1.e-1, gtol = 5.e-1
//        This results in a fairly accurate line search
//
// Here is the mathematical description of the algorithm
// (g = grad f).
//                     -1
//        1.  set z = M  g, search = -z; 
//
//        2.  for i=0 until convergence
//
//                 find alpha that minimizes f(x + alpha*search)
//                 subject to the strong Wolfe conditions
//
//                 Test for convergence
//
//
//                 beta = -( g  ,  (z     - z ) ) / ( g  , z  )
//                            i+1    i + 1   i         i    i
//
//                 search     =  - z     +   beta * search
//                       i+1        i+1                   i
//
//----------------------------------------------------------------------------
     
{

  int i, nlcg_iter;
  int convgd = 0;
  int step_type;

  double beta;
  double delta, delta_old, delta_mid, delta_new;
  double slope, gnorm;

  double step;
  double zero = 0.;
  
// Allocate local vectors 

  int n = dim;
  int maxiter;
  double fvalue;
  ColumnVector search(n), grad(n), z(n), diag(n), xc(n);

// Initialize iteration

  maxiter = tol.getMaxIter();

  initOpt();

  if (ret_code == 0) {
    //  compute preconditioned gradient

    diag = getFcnScale();
    grad = nlp->getGrad();
    for (i=1; i<=n; i++) z(i) = grad(i)/diag(i);

    search    = -z;
    delta_old = delta_new = Dot(grad,z);
    gnorm     = sqrt(Dot(grad,grad));

    step    = 1.0/gnorm;

//---------------------------------------------------------------------------
//
//
//
//
//---------------------------------------------------------------------------

    for (nlcg_iter=1; nlcg_iter <= maxiter; nlcg_iter++) {

      iter_taken = nlcg_iter;

      //  compute a step along the direction search 

      if ((step_type = computeStep(search)) < 0) {
	setMesg("Algorithm terminated - No longer able to compute step with sufficient decrease");
	ret_code = step_type;
        setReturnCode(ret_code);
	return;
      }
    
      //  Accept this step and update the nonlinear model

      acceptStep(nlcg_iter, step_type);
      updateModel(nlcg_iter, n, xprev);

      xc         = nlp->getXc();
      mem_step   = xc - xprev;
      step       = Norm2(mem_step);

      fvalue     = nlp->getF();
      grad       = nlp->getGrad();
      gnorm      = sqrt(Dot(grad,grad));
      slope      = Dot(grad,search);

      //  Test for Convergence

      convgd = checkConvg();
      if (convgd > 0) {
	ret_code = convgd;
        setReturnCode(ret_code);
	*optout  << d(nlcg_iter,5) << " " << e(fvalue,12,4)  << " "
		 << e(gnorm,12,4)  << e(step,12,4) << "\n";
	return;
      }

      //
      //  compute a new search direction
      //  1. compute preconditioned gradient,  z = grad;
      //  2. beta is computed using Polak-Ribiere Formula constrained 
      //     so that beta > 0
      //  3  Update search direction and norms 
  
      delta_old = delta_new; delta_mid = Dot(grad,z);

      for (i=1; i<=n; i++) z(i) = grad(i)/diag(i);

      delta_new = Dot(grad,z);
      delta     = delta_new - delta_mid;
      beta      = max(zero,delta/delta_old);

      search = -z + search*beta;

      xprev  = nlp->getXc();
      fprev  = fvalue;
      gprev  = grad;

      *optout 
	<< d(nlcg_iter,5) << " " << e(fvalue,12,4) << " " << e(gnorm,12,4) 
	<< e(step,12,4)   << " " << e(beta,12,4)   << " " << e(slope,12,4) 
	<< d(fcn_evals,4) << " " << d(grad_evals,4) << endl;
    }

    setMesg("Algorithm terminated - Number of iterations exceeds the specified limit");
    ret_code = 4;
    setReturnCode(ret_code);
  }
}