bool test(bool is_kernel_exact = true)
{
	// types
  typedef typename K::FT FT;
  typedef typename K::Line_3 Line;
  typedef typename K::Point_3 Point;
  typedef typename K::Segment_3 Segment;
  typedef typename K::Ray_3 Ray;
  typedef typename K::Line_3 Line;
  typedef typename K::Triangle_3 Triangle;

  /* -------------------------------------
  // Test data is something like that (in t supporting plane)
  // Triangle is (p1,p2,p3)
  //
  //       +E          +1
  //                 /   \
  //        +C     6+  +8  +4      +B
  //              /   9++7  \
  //            3+-------+5--+2
  //     
  //         +F        +A      
  ------------------------------------- */
  
  Point p1(FT(1.), FT(0.), FT(0.));
  Point p2(FT(0.), FT(1.), FT(0.));
  Point p3(FT(0.), FT(0.), FT(1.));
  
  Triangle t(p1,p2,p3);
  
  // Edges of t 
  Segment s12(p1,p2);
  Segment s21(p2,p1);
  Segment s13(p1,p3);
  Segment s23(p2,p3);
  Segment s32(p3,p2);
  Segment s31(p3,p1);
  
  bool b = test_aux(is_kernel_exact,t,s12,"t-s12",s12);
  b &= test_aux(is_kernel_exact,t,s21,"t-s21",s21);
  b &= test_aux(is_kernel_exact,t,s13,"t-s13",s13);
  b &= test_aux(is_kernel_exact,t,s23,"t-s23",s23);

  // Inside points
  Point p4(FT(0.5), FT(0.5), FT(0.));
  Point p5(FT(0.), FT(0.75), FT(0.25));
  Point p6(FT(0.5), FT(0.), FT(0.5));
  Point p7(FT(0.25), FT(0.625), FT(0.125));
  Point p8(FT(0.5), FT(0.25), FT(0.25));
  
  Segment s14(p1,p4);
  Segment s41(p4,p1);
  Segment s24(p2,p4);
  Segment s42(p4,p2);
  Segment s15(p1,p5);
  Segment s25(p2,p5);
  Segment s34(p3,p4);
  Segment s35(p3,p5);
  Segment s36(p3,p6);
  Segment s45(p4,p5);
  Segment s16(p1,p6);
  Segment s26(p2,p6);
  Segment s62(p6,p2);
  Segment s46(p4,p6);
  Segment s48(p4,p8);
  Segment s56(p5,p6);
  Segment s65(p6,p5);
  Segment s64(p6,p4);
  Segment s17(p1,p7);
  Segment s67(p6,p7);
  Segment s68(p6,p8);
  Segment s86(p8,p6);
  Segment s78(p7,p8);
  Segment s87(p8,p7);
  
  b &= test_aux(is_kernel_exact,t,s14,"t-s14",s14);
  b &= test_aux(is_kernel_exact,t,s41,"t-s41",s41);
  b &= test_aux(is_kernel_exact,t,s24,"t-s24",s24);
  b &= test_aux(is_kernel_exact,t,s42,"t-s42",s42);
  b &= test_aux(is_kernel_exact,t,s15,"t-s15",s15);
  b &= test_aux(is_kernel_exact,t,s25,"t-s25",s25);
  b &= test_aux(is_kernel_exact,t,s34,"t-s34",s34);
  b &= test_aux(is_kernel_exact,t,s35,"t-s35",s35);
  b &= test_aux(is_kernel_exact,t,s36,"t-s36",s36);
  b &= test_aux(is_kernel_exact,t,s45,"t-s45",s45);
  b &= test_aux(is_kernel_exact,t,s16,"t-s16",s16);
  b &= test_aux(is_kernel_exact,t,s26,"t-s26",s26);
  b &= test_aux(is_kernel_exact,t,s62,"t-s62",s62);
  b &= test_aux(is_kernel_exact,t,s46,"t-s46",s46);
  b &= test_aux(is_kernel_exact,t,s65,"t-s65",s65);
  b &= test_aux(is_kernel_exact,t,s64,"t-s64",s64);
  b &= test_aux(is_kernel_exact,t,s48,"t-s48",s48);
  b &= test_aux(is_kernel_exact,t,s56,"t-s56",s56);
  b &= test_aux(is_kernel_exact,t,s17,"t-t17",s17);
  b &= test_aux(is_kernel_exact,t,s67,"t-t67",s67);
  b &= test_aux(is_kernel_exact,t,s68,"t-s68",s68);
  b &= test_aux(is_kernel_exact,t,s86,"t-s86",s86);
  b &= test_aux(is_kernel_exact,t,s78,"t-t78",s78);
  b &= test_aux(is_kernel_exact,t,s87,"t-t87",s87);
  
  // Outside points (in triangle plane)
  Point pA(FT(-0.5), FT(1.), FT(0.5));
  Point pB(FT(0.5), FT(1.), FT(-0.5));
  Point pC(FT(0.5), FT(-0.5), FT(1.));
  Point pE(FT(1.), FT(-1.), FT(1.));
  Point pF(FT(-1.), FT(0.), FT(2.));
  
  Segment sAB(pA,pB);
  Segment sBC(pB,pC);
  Segment s2E(p2,pE);
  Segment sE2(pE,p2);
  Segment s2A(p2,pA);
  Segment s6E(p6,pE);
  Segment sB8(pB,p8);
  Segment sC8(pC,p8);
  Segment s8C(p8,pC);
  Segment s1F(p1,pF);
  Segment sF6(pF,p6);
  
  b &= test_aux(is_kernel_exact,t,sAB,"t-sAB",p2);
  b &= test_aux(is_kernel_exact,t,sBC,"t-sBC",s46);
  b &= test_aux(is_kernel_exact,t,s2E,"t-s2E",s26);
  b &= test_aux(is_kernel_exact,t,sE2,"t-sE2",s62);
  b &= test_aux(is_kernel_exact,t,s2A,"t-s2A",p2);
  b &= test_aux(is_kernel_exact,t,s6E,"t-s6E",p6);
  b &= test_aux(is_kernel_exact,t,sB8,"t-sB8",s48);
  b &= test_aux(is_kernel_exact,t,sC8,"t-sC8",s68);
  b &= test_aux(is_kernel_exact,t,s8C,"t-s8C",s86);
  b &= test_aux(is_kernel_exact,t,s1F,"t-s1F",s13);
  b &= test_aux(is_kernel_exact,t,sF6,"t-sF6",s36);
  
  // Outside triangle plane
  Point pa(FT(0.), FT(0.), FT(0.));
  Point pb(FT(2.), FT(0.), FT(0.));
  Point pc(FT(1.), FT(0.), FT(1.));
  Point pe(FT(1.), FT(0.5), FT(0.5));
  
  Segment sab(pa,pb);
  Segment sac(pa,pc);
  Segment sae(pa,pe);
  Segment sa8(pa,p8);
  Segment sb2(pb,p2);
  
  b &= test_aux(is_kernel_exact,t,sab,"t-sab",p1);
  b &= test_aux(is_kernel_exact,t,sac,"t-sac",p6);
  b &= test_aux(is_kernel_exact,t,sae,"t-sae",p8);
  b &= test_aux(is_kernel_exact,t,sa8,"t-sa8",p8);
  b &= test_aux(is_kernel_exact,t,sb2,"t-sb2",p2);
  
  // -----------------------------------
  // ray queries
  // -----------------------------------
  // Edges of t 
  Ray r12(p1,p2);
  Ray r21(p2,p1);
  Ray r13(p1,p3);
  Ray r23(p2,p3);
  
  b &= test_aux(is_kernel_exact,t,r12,"t-r12",s12);
  b &= test_aux(is_kernel_exact,t,r21,"t-r21",s21);
  b &= test_aux(is_kernel_exact,t,r13,"t-r13",s13);
  b &= test_aux(is_kernel_exact,t,r23,"t-r23",s23);
  
  // In triangle
  Point p9_(FT(0.), FT(0.5), FT(0.5));
  Point p9(FT(0.25), FT(0.375), FT(0.375));
  
  Ray r14(p1,p4);
  Ray r41(p4,p1);
  Ray r24(p2,p4);
  Ray r42(p4,p2);
  Ray r15(p1,p5);
  Ray r25(p2,p5);
  Ray r34(p3,p4);
  Ray r35(p3,p5);
  Ray r36(p3,p6);
  Ray r45(p4,p5);
  Ray r16(p1,p6);
  Ray r26(p2,p6);
  Ray r62(p6,p2);
  Ray r46(p4,p6);
  Ray r48(p4,p8);
  Ray r56(p5,p6);
  Ray r47(p4,p7);
  Ray r89(p8,p9);
  Ray r86(p8,p6);
  Ray r68(p6,p8);
  Segment r89_res(p8,p9_);
  
  b &= test_aux(is_kernel_exact,t,r14,"t-r14",s12);
  b &= test_aux(is_kernel_exact,t,r41,"t-r41",s41);
  b &= test_aux(is_kernel_exact,t,r24,"t-r24",s21);
  b &= test_aux(is_kernel_exact,t,r42,"t-r42",s42);
  b &= test_aux(is_kernel_exact,t,r15,"t-r15",s15);
  b &= test_aux(is_kernel_exact,t,r25,"t-r25",s23);
  b &= test_aux(is_kernel_exact,t,r34,"t-r34",s34);
  b &= test_aux(is_kernel_exact,t,r35,"t-r35",s32);
  b &= test_aux(is_kernel_exact,t,r36,"t-r36",s31);
  b &= test_aux(is_kernel_exact,t,r45,"t-r45",s45);
  b &= test_aux(is_kernel_exact,t,r16,"t-r16",s13);
  b &= test_aux(is_kernel_exact,t,r26,"t-r26",s26);
  b &= test_aux(is_kernel_exact,t,r62,"t-r62",s62);
  b &= test_aux(is_kernel_exact,t,r46,"t-r46",s46);
  b &= test_aux(is_kernel_exact,t,r48,"t-r48",s46);
  b &= test_aux(is_kernel_exact,t,r56,"t-r56",s56);
  b &= test_aux(is_kernel_exact,t,r47,"t-r47",s45);
  b &= test_aux(is_kernel_exact,t,r89,"t-t89",r89_res);
  b &= test_aux(is_kernel_exact,t,r68,"t-r68",s64);
  b &= test_aux(is_kernel_exact,t,r86,"t-r86",s86);
  
  
  // Outside points (in triangre prane)
  Ray rAB(pA,pB);
  Ray rBC(pB,pC);
  Ray r2E(p2,pE);
  Ray rE2(pE,p2);
  Ray r2A(p2,pA);
  Ray r6E(p6,pE);
  Ray rB8(pB,p8);
  Ray rC8(pC,p8);
  Ray r8C(p8,pC);
  Ray r1F(p1,pF);
  Ray rF6(pF,p6);
  
  b &= test_aux(is_kernel_exact,t,rAB,"t-rAB",p2);
  b &= test_aux(is_kernel_exact,t,rBC,"t-rBC",s46);
  b &= test_aux(is_kernel_exact,t,r2E,"t-r2E",s26);
  b &= test_aux(is_kernel_exact,t,rE2,"t-rE2",s62);
  b &= test_aux(is_kernel_exact,t,r2A,"t-r2A",p2);
  b &= test_aux(is_kernel_exact,t,r6E,"t-r6E",p6);
  b &= test_aux(is_kernel_exact,t,rB8,"t-rB8",s46);
  b &= test_aux(is_kernel_exact,t,rC8,"t-rC8",s64);
  b &= test_aux(is_kernel_exact,t,r8C,"t-r8C",s86);
  b &= test_aux(is_kernel_exact,t,r1F,"t-r1F",s13);
  b &= test_aux(is_kernel_exact,t,rF6,"t-rF6",s31);
  
  // Outside triangle plane
  Ray rab(pa,pb);
  Ray rac(pa,pc);
  Ray rae(pa,pe);
  Ray ra8(pa,p8);
  Ray rb2(pb,p2);
  
  b &= test_aux(is_kernel_exact,t,rab,"t-rab",p1);
  b &= test_aux(is_kernel_exact,t,rac,"t-rac",p6);
  b &= test_aux(is_kernel_exact,t,rae,"t-rae",p8);
  b &= test_aux(is_kernel_exact,t,ra8,"t-ra8",p8);
  b &= test_aux(is_kernel_exact,t,rb2,"t-rb2",p2);
  
  // -----------------------------------
  // Line queries
  // -----------------------------------
  // Edges of t 
  Line l12(p1,p2);
  Line l21(p2,p1);
  Line l13(p1,p3);
  Line l23(p2,p3);
  
  b &= test_aux(is_kernel_exact,t,l12,"t-l12",s12);
  b &= test_aux(is_kernel_exact,t,l21,"t-l21",s21);
  b &= test_aux(is_kernel_exact,t,l13,"t-l13",s13);
  b &= test_aux(is_kernel_exact,t,l23,"t-l23",s23);
  
  // In triangle
  Line l14(p1,p4);
  Line l41(p4,p1);
  Line l24(p2,p4);
  Line l42(p4,p2);
  Line l15(p1,p5);
  Line l25(p2,p5);
  Line l34(p3,p4);
  Line l35(p3,p5);
  Line l36(p3,p6);
  Line l45(p4,p5);
  Line l16(p1,p6);
  Line l26(p2,p6);
  Line l62(p6,p2);
  Line l46(p4,p6);
  Line l48(p4,p8);
  Line l56(p5,p6);
  Line l47(p4,p7);
  Line l89(p8,p9);
  Line l86(p8,p6);
  Line l68(p6,p8);
  Segment l89_res(p1,p9_);

  
  b &= test_aux(is_kernel_exact,t,l14,"t-l14",s12);
  b &= test_aux(is_kernel_exact,t,l41,"t-l41",s21);
  b &= test_aux(is_kernel_exact,t,l24,"t-l24",s21);
  b &= test_aux(is_kernel_exact,t,l42,"t-l42",s12);
  b &= test_aux(is_kernel_exact,t,l15,"t-l15",s15);
  b &= test_aux(is_kernel_exact,t,l25,"t-l25",s23);
  b &= test_aux(is_kernel_exact,t,l34,"t-l34",s34);
  b &= test_aux(is_kernel_exact,t,l35,"t-l35",s32);
  b &= test_aux(is_kernel_exact,t,l36,"t-l36",s31);
  b &= test_aux(is_kernel_exact,t,l45,"t-l45",s45);
  b &= test_aux(is_kernel_exact,t,l16,"t-l16",s13);
  b &= test_aux(is_kernel_exact,t,l26,"t-l26",s26);
  b &= test_aux(is_kernel_exact,t,l62,"t-l62",s62);
  b &= test_aux(is_kernel_exact,t,l46,"t-l46",s46);
  b &= test_aux(is_kernel_exact,t,l48,"t-l48",s46);
  b &= test_aux(is_kernel_exact,t,l56,"t-l56",s56);
  b &= test_aux(is_kernel_exact,t,l47,"t-l47",s45);
  b &= test_aux(is_kernel_exact,t,l89,"t-t89",l89_res);
  b &= test_aux(is_kernel_exact,t,l68,"t-l68",s64);
  b &= test_aux(is_kernel_exact,t,l86,"t-l86",s46);

  
  // Outside points (in triangle plane)
  Line lAB(pA,pB);
  Line lBC(pB,pC);
  Line l2E(p2,pE);
  Line lE2(pE,p2);
  Line l2A(p2,pA);
  Line l6E(p6,pE);
  Line lB8(pB,p8);
  Line lC8(pC,p8);
  Line l8C(p8,pC);
  Line l1F(p1,pF);
  Line lF6(pF,p6);
  
  b &= test_aux(is_kernel_exact,t,lAB,"t-lAB",p2);
  b &= test_aux(is_kernel_exact,t,lBC,"t-lBC",s46);
  b &= test_aux(is_kernel_exact,t,l2E,"t-l2E",s26);
  b &= test_aux(is_kernel_exact,t,lE2,"t-lE2",s62);
  b &= test_aux(is_kernel_exact,t,l2A,"t-l2A",p2);
  b &= test_aux(is_kernel_exact,t,l6E,"t-l6E",s26);
  b &= test_aux(is_kernel_exact,t,lB8,"t-lB8",s46);
  b &= test_aux(is_kernel_exact,t,lC8,"t-lC8",s64);
  b &= test_aux(is_kernel_exact,t,l8C,"t-l8C",s46);
  b &= test_aux(is_kernel_exact,t,l1F,"t-l1F",s13);
  b &= test_aux(is_kernel_exact,t,lF6,"t-lF6",s31);
  
  // Outside triangle plane
  Line lab(pa,pb);
  Line lac(pa,pc);
  Line lae(pa,pe);
  Line la8(pa,p8);
  Line lb2(pb,p2);
  
  b &= test_aux(is_kernel_exact,t,lab,"t-lab",p1);
  b &= test_aux(is_kernel_exact,t,lac,"t-lac",p6);
  b &= test_aux(is_kernel_exact,t,lae,"t-lae",p8);
  b &= test_aux(is_kernel_exact,t,la8,"t-la8",p8);
  b &= test_aux(is_kernel_exact,t,lb2,"t-lb2",p2);
  
  
	return b;
}
Beispiel #2
0
/** The RadiusClass is C++ library for RADIUS authentication and accounting.
 * Features:
 * - Sending and Receiving RADIUS packets.
 * - Generates password and authentication packet fields at sending, 
 * 		you only need to set the plain text password for the user for ACCESS_REQUEST packets
 * - password length optional
 * - timeouts for waiting on response packets
 * - sending retries if no response from server
 * - sending to optional number of servers:
 * 		- the first server from the config file is taken
 * 			- config parameter: e.g. wait=5 : wait 5s on a response
 * 			- config parameter: e.g. retry=2 : retry sending the packet 2 times after timeout
 * 		- if the first server do not response -> take the next server from config file
 * - extract attributes from the response packet, e.g. FramedIp or FramedRoutes
 * - functions to convert values from the response packets for integers and ip address as string (see function parseResponsePacket())
 **/
int main_test (void)
{
	
	list<RadiusServer> * serverlist;
	list<RadiusServer>::iterator server;
	//create RadiusPacket: you can already specify the type
	RadiusPacket		packet_access(ACCESS_REQUEST);
	
	//the packets for accounting (start,update,stop)
	RadiusPacket		packet_accounting_start(ACCOUNTING_REQUEST);
	RadiusPacket		packet_accounting_update(ACCOUNTING_REQUEST);
	RadiusPacket		packet_accounting_stop(ACCOUNTING_REQUEST);
	
	//create RadiusAttributes: you can specify type and value.
	RadiusAttribute		ra1(ATTRIB_User_Name,"user1"),
						ra2(ATTRIB_User_Password),
						ra3(ATTRIB_NAS_Port,55),
						ra4(ATTRIB_Calling_Station_Id,"127.0.0.1"),
						ra5(ATTRIB_NAS_Identifier),
						ra6(ATTRIB_NAS_IP_Address),
						ra7(ATTRIB_NAS_Port_Type),
						ra8(ATTRIB_Service_Type),
						ra9(ATTRIB_Framed_IP_Address),
						ra10(ATTRIB_Acct_Session_ID, 99),
						//for accounting packet type (start/update/stop)
						ra11(ATTRIB_Acct_Status_Type),
						ra12(ATTRIB_Framed_Protocol),
						
						//for accounting update and stop packets
						ra13(ATTRIB_Acct_Input_Octets, 99),
						ra14(ATTRIB_Acct_Output_Octets, 10),
						ra15(ATTRIB_Acct_Session_Time, 12345),
						ra16(ATTRIB_Vendor_Specific);
						
	RadiusVendorSpecificAttribute rvsa;
	
	//read in the config
	RadiusConfig config(string("./exampleconfig"));
	
	cout << "*** Sampleprogramm for the RadiusClass. ***\n";
	cout << "---- Print Config ----\n";
	cout << config;
	cout << "-----------------------\n";
	
	// Send a ACCEPT-REQUEST-PACKET
	cout << "-----------------------------------------------------\n";
	cout << "-------- Send a ACCESS-REQUEST-PACKET ---------------\n";
	cout << "-----------------------------------------------------\n";
	
	/*set password (the method setValue() detects which type
	 * the attribut is from, and converts the value correct for
	 * this type)
	 */
	ra2.setValue(string("testing"));
	if(packet_access.addRadiusAttribute(&ra1))
	{
		cerr << getTime() << "RADIUS-CLASS: Fail to add attribute ATTRIB_User_Name.\n";
	}
	if (packet_access.addRadiusAttribute(&ra2))
	{
		cerr << getTime() << "RADIUS-CLASS: Fail to add attribute ATTRIB_User_Password.\n";
	}
	if (packet_access.addRadiusAttribute(&ra3))
	{
		cerr << getTime() << "RADIUS-CLASS: Fail to add attribute ATTRIB_NAS_Port.\n";
	}
	if (packet_access.addRadiusAttribute(&ra4))
	{
		cerr << getTime() << "RADIUS-CLASS: Fail to add attribute ATTRIB_Calling_Station_Id.\n";
	}
	//get information from the config and add it to the packet
	if(strcmp(config.getNASIdentifier(),""))
	{
			ra5.setValue(config.getNASIdentifier());
			if (packet_access.addRadiusAttribute(&ra5))
			{
				cerr << getTime() << "RADIUS-CLASS: Fail to add attribute ATTRIB_NAS_Identifier.\n";
			}
	}
	
	if(strcmp(config.getNASIpAddress(),""))
	{
			if(ra6.setValue(config.getNASIpAddress())!=0)
			{
				cerr << getTime() << "RADIUS-CLASS: Fail to set value ATTRIB_NAS_Ip_Address.\n";
			}
			else
			if (packet_access.addRadiusAttribute(&ra6))
			{
				cerr << getTime() << "RADIUS-CLASS: Fail to add attribute ATTRIB_NAS_Ip_Address.\n";
			}
	}
	if(strcmp(config.getNASPortType(),""))
	{
			ra7.setValue(config.getNASPortType());
			if (packet_access.addRadiusAttribute(&ra7))
			{
				cerr << getTime() << "RADIUS-CLASS: Fail to add attribute ATTRIB_NAS_Port_Type.\n";
			}
	}
	
	if(strcmp(config.getServiceType(),""))
	{
			ra8.setValue(config.getServiceType());
			if (packet_access.addRadiusAttribute(&ra8))
			{
				cerr << getTime() << "RADIUS-CLASS: Fail to add attribute ATTRIB_Service_Type.\n";
			}
	}
	
	//example for sending vendor specific attribute
	rvsa.setId(123);
	rvsa.setType(1);
	rvsa.setValue("Vendor Attribute");
	//integers can be set directly
	//rvsa.setValue(1981);
	Octet * tmp_rvsa=new Octet[rvsa.getLength()+4];
	
	rvsa.getShapedAttribute(tmp_rvsa);
	ra16.setValue((char *)tmp_rvsa);
	
	packet_access.addRadiusAttribute(&ra16);
	
	delete [] tmp_rvsa;
	
	
	//get the server list
	serverlist=config.getRadiusServer();
	
	//check if there are servers
	try
	{
		if(serverlist->empty()==true)
		{
			throw(string("RADIUS-CLASS: No servers defined!"));
		}
	}
	catch(string)
	{
		cerr<< "No servers!";
		//stop the programm if there are no server(s) in config
		return 0;
	}
	
	//set server to the first server
	server=serverlist->begin();
	
	//send the packet to the first server from the list
	if (packet_access.radiusSend(server)<0)
	{
		cerr << getTime() << "RADIUS-CLASS: Packet was not send.\n";
	}
	
	//receive the packet, if the server doesn't response send the packet to the next server in list.
	if (packet_access.radiusReceive(serverlist)==0)
	{
		//is it a accept?
		if(packet_access.getCode()==ACCESS_ACCEPT)
		{
			/*Parse the attributes for framedip, framedroutes and acctinteriminterval.
			This is only an example, so the function has no return values, the
			values are printed at stdout.*/
			parseResponsePacket(&packet_access);
				
		}
		//If the radius server denied the access or sends a ACCESS_CHALLANGE-packet.
		else
		{
			cerr << getTime() << "RADIUS-CLASS: Get ACCESS_REJECT or ACCESS_CHALLANGE-Packet.->ACCESS-DENIED.\n";
		}
		
	}
	else
	{
		cerr << getTime() << "RADIUS-CLASS: Got no or bad response from radius server.\n";
	}
	
	
	// Send a ACCOUNTING-REQUEST-PACKET, Status-Type:Start
	
	cout << "-----------------------------------------------------\n";
	cout << "-------- Send a ACCOUNTING-REQUEST-PACKET -----------\n";
	cout << "-----------------Status-Type: Start------------------\n";
	cout << "-----------------------------------------------------\n";
	
	
	//add the attributes to the packet
	if(packet_accounting_start.addRadiusAttribute(&ra1))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_User_Name.\n";
	}
	
	
	if (packet_accounting_start.addRadiusAttribute(&ra3))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Port.\n";
	}
	if (packet_accounting_start.addRadiusAttribute(&ra4))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Calling_Station_Id.\n";
	}
	
	
	
	if (packet_accounting_start.addRadiusAttribute(&ra10))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Session_Id.\n";
	}
	
	//set status type: start = 1 (see RADIUS RFC)
	ra11.setValue(string("1"));
	if (packet_accounting_start.addRadiusAttribute(&ra11))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Status_Type.\n";
	}
	
	
	//get information from the config and add the attributes to the packet
	if(strcmp(config.getNASIdentifier(),""))
	{
			ra5.setValue(config.getNASIdentifier());
			if (packet_accounting_start.addRadiusAttribute(&ra5))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Identifier.\n";
			}
	}
	
	if(strcmp(config.getNASIpAddress(),""))
	{
			if(ra6.setValue(config.getNASIpAddress())!=0)
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to set value ATTRIB_NAS_Ip_Address.\n";
			}
	
			if (packet_accounting_start.addRadiusAttribute(&ra6))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Ip_Address.\n";
			}
	}
	if(strcmp(config.getNASPortType(),""))
	{
			ra7.setValue(config.getNASPortType());
			if (packet_accounting_start.addRadiusAttribute(&ra7))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Port_Type.\n";
			}
	}
	
	if(strcmp(config.getServiceType(),""))
	{
			ra8.setValue(config.getServiceType());
			if (packet_accounting_start.addRadiusAttribute(&ra8))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Service_Type.\n";
			}
	}
	if(strcmp(config.getFramedProtocol(),""))
	{
			ra12.setValue(config.getFramedProtocol());
			if (packet_accounting_start.addRadiusAttribute(&ra12))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_FramedProtocol.\n";
			}
	}
	ra9.setValue(string("111.222.111.111"));
	if (packet_accounting_start.addRadiusAttribute(&ra9))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Session_ID.\n";
	}
	
	
	
	//send the packet_accounting_start	
	if (packet_accounting_start.radiusSend(server)<0)
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Packet was not send.\n";
	}
	
	//receive the response
	if (packet_accounting_start.radiusReceive(serverlist)>=0)
	{
		//is is a accounting resopnse ?
		if(packet_accounting_start.getCode()==ACCOUNTING_RESPONSE)
		{
			cerr << getTime() << "RADIUS-CLASS:  Get ACCOUNTING_RESPONSET-Packet.\n";

		}
	}	
	else
	{
		cerr << getTime() << "RADIUS-CLASS: Got no or bad response from radius server.\n";
	}
	
	// Send a ACCOUNTING-REQUEST-PACKET, Status-Type:Update
	
	cout << "-----------------------------------------------------\n";
	cout << "-------- Send a ACCOUNTING-REQUEST-PACKET -----------\n";
	cout << "-----------------Status-Type: Update-----------------\n";
	cout << "-----------------------------------------------------\n";
	
	//add the attributes to the packet
	if(packet_accounting_update.addRadiusAttribute(&ra1))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_User_Name.\n";
	}
	
	
	if (packet_accounting_update.addRadiusAttribute(&ra3))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Port.\n";
	}
	if (packet_accounting_update.addRadiusAttribute(&ra4))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Calling_Station_Id.\n";
	}
	
	
	
	
	if (packet_accounting_update.addRadiusAttribute(&ra10))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Session_Id.\n";
	}
	
	//set status type: update = 3(see RADIUS RFC)
	ra11.setValue(string("3"));
	if (packet_accounting_update.addRadiusAttribute(&ra11))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Status_Type.\n";
	}
	
	
	
	if (packet_accounting_update.addRadiusAttribute(&ra13))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Input_Octets.\n";
	}
	if (packet_accounting_update.addRadiusAttribute(&ra14))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Output_Octets.\n";
	}
	if (packet_accounting_update.addRadiusAttribute(&ra14))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Session_Time.\n";
	}
	
	//get information from the config and add the attributes to the packet
	if(strcmp(config.getNASIdentifier(),""))
	{
			ra5.setValue(config.getNASIdentifier());
			if (packet_accounting_update.addRadiusAttribute(&ra5))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Identifier.\n";
			}
	}
	
	if(strcmp(config.getNASIpAddress(),""))
	{
			if(ra6.setValue(config.getNASIpAddress())!=0)
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to set value ATTRIB_NAS_Ip_Address.\n";
			}
	
			if (packet_accounting_update.addRadiusAttribute(&ra6))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Ip_Address.\n";
			}
	}
	if(strcmp(config.getNASPortType(),""))
	{
			ra7.setValue(config.getNASPortType());
			if (packet_accounting_update.addRadiusAttribute(&ra7))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Port_Type.\n";
			}
	}
	
	if(strcmp(config.getServiceType(),""))
	{
			ra8.setValue(config.getServiceType());
			if (packet_accounting_update.addRadiusAttribute(&ra8))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Service_Type.\n";
			}
	}
	if(strcmp(config.getFramedProtocol(),""))
	{
			ra12.setValue(config.getFramedProtocol());
			if (packet_accounting_update.addRadiusAttribute(&ra12))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_FramedProtocol.\n";
			}
	}
	ra9.setValue(string("111.222.111.111"));
	if (packet_accounting_update.addRadiusAttribute(&ra9))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Session_ID.\n";
	}
	
	
	
	//send the packet_accounting_update	
	if (packet_accounting_update.radiusSend(server)<0)
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Packet was not send.\n";
	}
	
	//receive the response
	if (packet_accounting_update.radiusReceive(serverlist)>=0)
	{
		//is is a accounting resopnse ?
		if(packet_accounting_update.getCode()==ACCOUNTING_RESPONSE)
		{
			cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Get ACCOUNTING_RESPONSET-Packet.\n";

		}
		
		
	}
	else
	{
		cerr << getTime() << "RADIUS-CLASS: Got no or bad response from radius server.\n";
	}
	
	// Send a ACCOUNTING-REQUEST-PACKET, Status-Type:Stop
	
	cout << "-----------------------------------------------------\n";
	cout << "-------- Send a ACCOUNTING-REQUEST-PACKET -----------\n";
	cout << "-----------------Status-Type: Stop-------------------\n";
	cout << "-----------------------------------------------------\n";
	
	//add the attributes to the packet
	if(packet_accounting_stop.addRadiusAttribute(&ra1))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_User_Name.\n";
	}
	
	
	if (packet_accounting_stop.addRadiusAttribute(&ra3))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Port.\n";
	}
	if (packet_accounting_stop.addRadiusAttribute(&ra4))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Calling_Station_Id.\n";
	}
	
	
	
	
	if (packet_accounting_stop.addRadiusAttribute(&ra10))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Session_Id.\n";
	}
	
	//set status type: update = 2(see RADIUS RFC)
	ra11.setValue(string("2"));
	if (packet_accounting_stop.addRadiusAttribute(&ra11))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Status_Type.\n";
	}
	
	
	
	if (packet_accounting_stop.addRadiusAttribute(&ra13))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Input_Octets.\n";
	}
	if (packet_accounting_stop.addRadiusAttribute(&ra14))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Output_Octets.\n";
	}
	if (packet_accounting_stop.addRadiusAttribute(&ra14))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Session_Time.\n";
	}
	
	//get information from the config and add the attributes to the packet
	if(strcmp(config.getNASIdentifier(),""))
	{
			ra5.setValue(config.getNASIdentifier());
			if (packet_accounting_stop.addRadiusAttribute(&ra5))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Identifier.\n";
			}
	}
	
	if(strcmp(config.getNASIpAddress(),""))
	{
			if(ra6.setValue(config.getNASIpAddress())!=0)
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to set value ATTRIB_NAS_Ip_Address.\n";
			}
	
			if (packet_accounting_stop.addRadiusAttribute(&ra6))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Ip_Address.\n";
			}
	}
	if(strcmp(config.getNASPortType(),""))
	{
			ra7.setValue(config.getNASPortType());
			if (packet_accounting_stop.addRadiusAttribute(&ra7))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_NAS_Port_Type.\n";
			}
	}
	
	if(strcmp(config.getServiceType(),""))
	{
			ra8.setValue(config.getServiceType());
			if (packet_accounting_stop.addRadiusAttribute(&ra8))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Service_Type.\n";
			}
	}
	if(strcmp(config.getFramedProtocol(),""))
	{
			ra12.setValue(config.getFramedProtocol());
			if (packet_accounting_stop.addRadiusAttribute(&ra12))
			{
				cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_FramedProtocol.\n";
			}
	}
	ra9.setValue(string("111.222.111.111"));
	if (packet_accounting_stop.addRadiusAttribute(&ra9))
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Fail to add attribute ATTRIB_Acct_Session_ID.\n";
	}
	
	
	
	//send the packet_accounting_stop	
	if (packet_accounting_stop.radiusSend(server)<0)
	{
		cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Packet was not send.\n";
	}
	
	//receive the response
	if (packet_accounting_stop.radiusReceive(serverlist)>=0)
	{
		//is is a accounting resopnse ?
		if(packet_accounting_stop.getCode()==ACCOUNTING_RESPONSE)
		{
			cerr << getTime() << "RADIUS-CLASS: BACKGROUND-ACCT:  Get ACCOUNTING_RESPONSET-Packet.\n";

		}
	}
	else
	{
		cerr << getTime() << "RADIUS-CLASS: Got no or bad response from radius server.\n";
	}
	
	cout << "\n---- End ----";
	return (0);


}