예제 #1
0
void router::forwrdMsg(const char* pMsg, size_t sz)
{
	unsigned long* ulp = (unsigned long*) pMsg;
	unsigned long dest;
	dest = *ulp++;
	ulp++;					//srcIP
	unsigned long len = *ulp;
	(*ulp)++;
	ulp++;
	*(ulp+len) = _myIP;
	if (toPrefix(dest) == toPrefix(_myIP))
	{
		_pcomm->sendMsg(dest, _inbuf, sz);
		printf("From %s: forwrdMsg - delivered message to host 0x%x.\n"
			,_name,dest);
	}
	else
	{
		struct in_addr	ia;
#ifdef WIN32
		ia.S_un.S_addr = dest;
#else
		ia.s_addr = dest;
#endif	
		IFWMap::iterator ft_it = _fwd_table.find(toPrefix(dest));
		if (ft_it == _fwd_table.end())
		{ //??ming look BGP table
			printf("From %s: Cannot forwar to %s. Messag is dropped\n",_name, inet_ntoa(ia));
			return;
		}
		_pcomm->sendMsg((*ft_it).second, _inbuf, sz);
		printf("From %s: forwrdMsg - forward message for 0x%x to router 0x%x.\n",
			_name,dest,(*ft_it).second);
	}
}
예제 #2
0
void router::changeCost(const char* pBuf, size_t sz)
{
	unsigned long*	lp = (unsigned long*)pBuf;
	lp++;							// skip AS
	unsigned long	rIP;
	rIP = *lp++;
	if (rIP == _myIP)
		rIP = *lp++;				// source Router
	else
		lp++;
	long	dCost = *lp++;	// new cost
	pa3Map::iterator nt_it = _nbr_table.find(rIP);	// get the neighbor
	if (nt_it == _nbr_table.end())
	{
		printf("From %s: changeCost - wrong link nbrIP=0x%x, newCost=%d.\n"
			,_name, rIP, dCost);
		return;
	}
	long nbrCost;
	long oldCost = (*nt_it).second;
	_nbr_table.erase(nt_it);			//delete old one
	_nbr_table.insert(pa3Map::value_type(rIP, dCost));
	dCost -= oldCost;
	pa3Map::iterator	dv_it;
	IFWMap::iterator	ft_it;
	bool				bMod = false;
	unsigned long prf;
	unsigned long hop;
	for (ft_it = _fwd_table.begin(); ft_it != _fwd_table.end(); ft_it++)
	{
		hop = (*ft_it).second;
		printf("From %s: changeCost - prf=%s,fw=%s.\n",_name,toIPString(prf),toIPString(hop));
		if (hop == rIP)
		{
			prf = (*ft_it).first;
			dv_it = _dv_table.find(prf);
			oldCost = (*dv_it).second;
			_dv_table.erase(dv_it);				//delete old one
			//if current path cost more then we have in neibour table, use neibour
			for (nt_it = _nbr_table.begin(); nt_it != _nbr_table.end(); nt_it++)
			{
				if ((toPrefix((*nt_it).first)==prf)&&((*nt_it).second<(oldCost+dCost)))
				{
					_dv_table.insert(pa3Map::value_type(prf,(*nt_it).second));
					_fwd_table.erase(ft_it);
					_fwd_table.insert(IFWMap::value_type(prf, (*nt_it).first));
					bMod = true;
					break;
				}
			}
			if (!bMod)
			{
				_dv_table.insert(pa3Map::value_type(prf, (oldCost+dCost)));
				bMod = true;
			}
		}
	}
	if (bMod)
		propaganda_DV();
}	
예제 #3
0
    std::string Antecedent::toPrefix(const Expression* node) const {
        if (not isLoaded()) {
            throw fl::Exception("[antecedent error] antecedent <" + _text + "> is not loaded", FL_AT);
        }
        if (not node) node = this->_expression;

        if (dynamic_cast<const Proposition*> (node)) {
            return node->toString();
        }
        std::stringstream ss;
        if (const Operator * fuzzyOperator = dynamic_cast<const Operator*> (node)) {
            ss << fuzzyOperator->toString() << " "
                    << toPrefix(fuzzyOperator->left) << " "
                    << toPrefix(fuzzyOperator->right) << " ";
        } else {
            ss << "[antecedent error] unknown class of Expression <" << node->toString() << ">";
        }
        return ss.str();
    }
예제 #4
0
int main(int argc, const char * argv[]) {
	
	String postfix = (String)calloc(SIZE, sizeof(char));
	
	printf("\n\tThis program will convert an Postfix expression to Prefix.\n\te.g. A B * C D / + = + * A B / C D .\n\n\tEnter an valid Postfix expression : ");
	fgets(postfix, SIZE, stdin);
	
	String prefix = toPrefix(postfix);
	
	printf("\n\n\tPostfix: %s\n\tPrefix: %s\n\n", postfix, prefix);
	
	return 0;
}
예제 #5
0
파일: InToPre.c 프로젝트: Anam9/CSE-Labs
int main()
{
	
	char *infix = (char *)calloc(SIZE, sizeof(char));
	
	printf("Enter infix expression : ");

	scanf("%s", infix);
	
	char *prefix = toPrefix(infix);
	
	printf("Infix: %s\nPrefix: %s\n", infix, prefix);
	
	return 0;
}
예제 #6
0
void router::ASupink(const char* pBuf, size_t sz)
{
	unsigned long* lp = (unsigned long*)pBuf;
	lp++;							//skip AS id1
	unsigned long	rIP;
	rIP = *lp++;
	if (rIP == _myIP)
	{
		lp++;						// skip AS id2
		rIP = *lp++;				// source Router
	}
	else
	{
		lp++;
		lp++;
	}
	bool	bMod = false;
	pa3Map::iterator nt_it = _nbr_table.find(rIP);
	struct in_addr	ia;
#ifdef WIN32
	ia.S_un.S_addr = rIP;
#else
	ia.s_addr = rIP;
#endif	
	if (nt_it == _nbr_table.end())
	{
		printf("From %s: unknown link to router %s. The message is ignored.\n"
			,_name,inet_ntoa(ia));
		return;
	}
	unsigned long prf = toPrefix(rIP);
	pa3Map::iterator dv_it = _dv_table.find(prf);
	IFWMap::iterator ft_it = _fwd_table.find(prf);
	if (dv_it != _dv_table.end())
		_dv_table.erase(dv_it);
	if (ft_it != _fwd_table.end())
		_fwd_table.erase(ft_it);
	_dv_table.insert(pa3Map::value_type(prf, (*nt_it).second));
	_fwd_table.insert(IFWMap::value_type(prf, rIP));
	if (bMod)
		propaganda_DV();
}
예제 #7
0
bool router::updateTables(unsigned long rIP, bool bAS)
{
	bool ret;
	pa3Map::iterator dv_it, nt_it;
	IFWMap::iterator ft_it;
	unsigned long prf = toPrefix(rIP);
	nt_it = _nbr_table.find(rIP);	// if it is our nbr 
	bool			bRep = false;
	if ((!bAS) && (nt_it != _nbr_table.end()))
		bRep = true;
	unsigned long oldPfx;
	for (ft_it = _fwd_table.begin(); ft_it != _fwd_table.end(); ft_it++)
	{
		if ((*ft_it).second == rIP)
		{
			oldPfx = (*ft_it).first;
			dv_it = _dv_table.find(oldPfx);
			_dv_table.erase(dv_it);			//delete old one
			_fwd_table.erase(ft_it);
			if ((bRep) && (oldPfx != prf))			// change to nbr
			{
				_dv_table.insert(pa3Map::value_type((*nt_it).first, (*nt_it).second));
				_fwd_table.insert(IFWMap::value_type(oldPfx, (*nt_it).first));
			}
			else
				_dv_table.insert(pa3Map::value_type(oldPfx, -1));
			ret = true;
			if (_fwd_table.empty())
				break;
		}
	}
#ifdef _TRACE
	printf("From %s: updateTables rIP = %lu\n",_name, rIP);
#endif
	return ret;
}
예제 #8
0
void router::updateDV(const char* pBuf, size_t sz)
{
	unsigned long*	lp = (unsigned long*)pBuf;
	unsigned long	fromAddr= *lp++;		// source Router
	struct in_addr ia;
#ifdef WIN32
	ia.S_un.S_addr = fromAddr;
#else
	ia.s_addr = fromAddr;
#endif	
	size_t			numDV = *lp++;			// numberDV
#ifdef _TRACE
	printf("From %s/updateDV: called fromAddr %s, msgSize=%d,numEnter=%d.\n",
		_name, inet_ntoa(ia), sz, numDV);
#endif
	if ((sz - sizeof(long) - sizeof(long)) < numDV*sizeof(long))
	{
		printf("From %s-updateDV: number entry is %d, msgSize=%d, not match\n"
			,_name, numDV, sz);
		return;
	}
	pa3Map::iterator nt_it = _nbr_table.find(fromAddr);	// get the neighbor
	if (nt_it == _nbr_table.end())
	{
		printf("From %s: Unknown neighour %s.\n", _name, inet_ntoa(ia));
		return;
	}
	pa3Map::iterator dv_it;
	unsigned long	dv_IP;
	long			dv_cost;
	bool			bMod = false;
	struct in_addr ria;
	IFWMap::iterator ft_it;
	for (size_t i = 0 ; i < numDV; i++)
	{
		dv_IP = (unsigned long) *lp++;
		dv_cost = *lp++;

		if (dv_IP == toPrefix(_myIP))
			continue;
#ifdef WIN32
		ria.S_un.S_addr = dv_IP;
#else
		ria.s_addr = dv_IP;
#endif
		dv_cost	+= (*nt_it).second;
		dv_it = _dv_table.find(dv_IP);
		if (dv_it != _dv_table.end())			// is it in our dv
		{
			if ((*dv_it).second == -1)			// was down
			{
				nt_it = _nbr_table.find(dv_IP);	// if link is down, will
				if (nt_it != _nbr_table.end())	// not accept from nbr
					bMod = true;
			}
			else if ((*dv_it).second > dv_cost)
			{
				printf("--From %s: updateDV  %d: change for %s new_cost=%d, my_dv=%d\n", 
					_name, i, inet_ntoa(ria), dv_cost,(*dv_it).second);
				bMod = true;
			} 
			else
			{
				ft_it = _fwd_table.find(dv_IP);
				printFT("updateDV 3");
				char temp[30];
				strcpy(temp, inet_ntoa(ia));
				if ((ft_it != _fwd_table.end())&&((*ft_it).first==dv_IP)&&
					((*ft_it).second==fromAddr)&&((*dv_it).second!=dv_cost))
				{
					printf("--From %s: updateDV nbr=%s, prfx=%s change: new_cost=%d, my_dv=%d\n", 
						_name, temp, inet_ntoa(ria), dv_cost,(*dv_it).second);
					bMod = true;
				}
			}
			if (bMod)
			{
				_dv_table.erase(dv_it);		// delete old one
				_dv_table.insert(pa3Map::value_type(dv_IP, dv_cost));
				ft_it = _fwd_table.find(dv_IP);
				if (ft_it != _fwd_table.end())
				{
					_fwd_table.erase(ft_it);
					if (dv_cost != -1)
						_fwd_table.insert(IFWMap::value_type(dv_IP, fromAddr));
				}
				else
					printf("From %s-updateDV: FT couldn't find dv_IP=%s, cost=%d, from 0x%x",
						_name, inet_ntoa(ria), dv_cost, fromAddr);
			}
		}
		else
		{
			bMod = true;
			_dv_table.insert(pa3Map::value_type(dv_IP, dv_cost));
			_fwd_table.insert(IFWMap::value_type(dv_IP, fromAddr));
			printf("--From %s: updateDV %d: insert new_dv=(%s,%d))\n",
				_name,i, inet_ntoa(ria), dv_cost);
		}
	}
	if (bMod)
		propaganda_DV();
}
예제 #9
0
void router::run()
{
	printf("From %s: router::run called.\n",_name);
	pa3Map::iterator nt_it;
	unsigned long nbrIPprf;
	_dv_table.insert(pa3Map::value_type(toPrefix(_myIP), 0));
	for (nt_it = _nbr_table.begin(); nt_it != _nbr_table.end(); nt_it++)
	{
		nbrIPprf = toPrefix((*nt_it).first);
/*		if ((nbrIP.S_un.S_addr>>8) != (_myIP.S_un.S_addr>>8))// from other AS?
		{
//			nbrIP.S_un.S_addr != 0x80000000; this may not work
		}	*/
		_dv_table.insert(pa3Map::value_type(nbrIPprf, (*nt_it).second));
		_fwd_table.insert(IFWMap::value_type(nbrIPprf, (*nt_it).first));
	}
	printf("initial DV..");
	printDV();
	printFT("run");
	propaganda_DV();

	bool bRun = true;
	while (bRun)
	{
		size_t sz = _pcomm->readMsg(_inbuf, BUFF_SIZE);
		if (sz == 0)
			propaganda_DV();	 
		else
		{
			switch (_inbuf[0])
			{
			case MSGTYPE_HMSG:
				forwrdMsg(&_inbuf[1], sz);
				break;
			case MSGTYPE_RDV:
				updateDV(&_inbuf[1], (sz-1));
				break;
			case MSGTYPE_CCHNG:
				changeCost(&_inbuf[1], (sz-1));
				break;
			case MSGTYPE_CDN:
				downLink(&_inbuf[1], (sz-1));
				break;
			case MSGTYPE_CASDN:
				ASdownLink(&_inbuf[1], (sz-1));
				break;
			case MSGTYPE_CASUP:
				ASupink(&_inbuf[1], (sz-1));
				break;
			case MSGTYPE_CPRNT:
				printFT("MSGTYPE_CPRNT");
				break;
			case MSGTYPE_CQUIT:
				bRun = false;
				break;
			case MSGTYPE_CPRNT_DV:
				printDV();
				break;
			case MSGTYPE_CPRNT_NT:
				printNT();
				break;
			default:
				printf("From %s: unknown message type %d. The message is dropped.\n",_name,_inbuf[0]);
			}
		}
	}
}