Beispiel #1
0
int udpWrite(u_int ud, const void* buf, long len)
{
    NBuf* pNBuf;
    IPHdr* ipHdr;
    UDPHdr* udpHdr;
    long rtn = 0;
    long copied;
    u_int mtu;

    UDPDEBUG(("udpWrite()\n"));
    if (!(udps[ud].flags & FUDP_OPEN)) return -1;
    mtu = ipMTU(ntohl(udps[ud].theirAddr.s_addr));
    if (!mtu) {
        UDPDEBUG(("no route to host\n"));
        return -1;
    }
    while (len) {
        pNBuf = NULL;
#if ONETASK_SUPPORT > 0
		// We can't do a loop forever in a onetask OS
        nGET(pNBuf);
		// No more nBuf buffers available, should return what we have copied so far
		if (!pNBuf) return rtn;
#else
		// BUSY WAITING! (not nice)
        do {
            nGET(pNBuf);
        } while (pNBuf == NULL);
#endif
		// Reserve room for headers 
		pNBuf->len = pNBuf->chainLen = sizeof(IPHdr) + sizeof(UDPHdr);

		// Add payload
		copied = nAppend(pNBuf, (const char *)&((unsigned char *)buf)[rtn], MIN(mtu - sizeof(IPHdr) - sizeof(UDPHdr), len));
		if (copied && pNBuf) {
			len -= copied;
			rtn += copied;

			// Setup IP header and prepare it so we can compute the UDP checksum
			// Use the IP header as UDP pseudo header
			ipHdr = nBUFTOPTR(pNBuf, IPHdr *);
			memcpy(ipHdr->ip_src.s_addr, (u_char*)&localHost,4);	//db change
			//my change
			memcpy(ipHdr->ip_dst.s_addr, udps[ud].theirAddr.s_addr, 4);// db change
			ipHdr->ip_ttl = 0;
			ipHdr->ip_p = IPPROTO_UDP;
	        ipHdr->ip_sum = htons(copied + sizeof(UDPHdr));

			// Build the UDP header 
			udpHdr = (void *)(ipHdr + 1);
			udpHdr->srcPort = udps[ud].ourPort;
			udpHdr->dstPort = udps[ud].theirPort;
			udpHdr->checksum = 0;
            udpHdr->length = ipHdr->ip_sum;

			// Compute UDP header checksum
	        udpHdr->checksum = inChkSum(pNBuf, pNBuf->chainLen - 8, 8);

			// Build IP header
			// db change
			ipHdr->ip_hl_v = ((sizeof(IPHdr) >> 2) & 0x0f) | (4 << 4);
//			ipHdr->ip_hl = sizeof(IPHdr) >> 2;
			ipHdr->ip_tos = udps[ud].tos;
	        ipHdr->ip_len = copied + sizeof(IPHdr) + sizeof(UDPHdr);
			ipHdr->ip_id = IPNEWID();
			ipHdr->ip_off = 0;
	        ipHdr->ip_ttl = UDPTTL;
			ipHdr->ip_sum = 0;
			ipHdr->ip_sum = inChkSum(pNBuf, sizeof(IPHdr), 0);
		} else {
Beispiel #2
0
void ArrayOps::evaluate(SymTab & symTab, std::unique_ptr<FuncTab> &funcTab) {
	auto type = symTab.getValueFor(_id)->type();
	if(_op == "append") {
		if(_test == nullptr) {
			std::cout << "ArrayOps::evaluate append, no element provided\n";
			exit(1);
		}
		auto element = _test->evaluate(symTab, funcTab);
		if( type == TypeDescriptor::NUMBERARRAY ) {
			if(element->type() == TypeDescriptor::INTEGER) {
				auto nDesc = dynamic_cast<NumberDescriptor*>(element.get());
				auto narray = dynamic_cast<NumberArray*>
					(symTab.getValueFor(_id).get());
				narray->nAppend(nDesc->value.intValue);
			} else {
				std::cout << "ArrayOps::append error: members must be of ";
				std::cout << "the same type\n";
				exit(1);
			}
		} else if(type == TypeDescriptor::STRINGARRAY) {
			if(element->type() == TypeDescriptor::STRING) {
				auto sDesc = dynamic_cast<StringDescriptor*>(element.get());
				auto sarray = dynamic_cast<StringArray*>
					(symTab.getValueFor(_id).get());
				sarray->sAppend(sDesc->value);
			} else {
				std::cout << "ArrayOps::append error: members must be of ";
				std::cout << "the same type\n";
				exit(1);
			}
		} else if (type == TypeDescriptor::NULLARRAY) {
			if(element->type() == TypeDescriptor::INTEGER) {
				auto nDesc = dynamic_cast<NumberDescriptor*>(element.get());
				if(nDesc == nullptr) {
					std::cout << "ArrayOps::evaluate  error: invalid cast";
					exit(1);
				}
				std::shared_ptr<NumberArray> narray =
					std::make_shared<NumberArray>(TypeDescriptor::NUMBERARRAY);
				narray->nAppend(nDesc->value.intValue);
				symTab.setValueFor(_id, narray);
			} else if(element->type() == TypeDescriptor::STRING) {
				auto sDesc = dynamic_cast<StringDescriptor*>(element.get());
				if(sDesc == nullptr) {
					std::cout << "ArrayOps::evaluate  error: invalid cast";
					exit(1);
				}					
				std::shared_ptr<StringArray> sarray =
					std::make_shared<StringArray>(TypeDescriptor::STRINGARRAY);
				sarray->sAppend(sDesc->value);
				symTab.setValueFor(_id, sarray);
			} else {
				std::cout << "append() is not supported for this type\n";
				exit(1);
			}
		} else {
			std::cout << "append() is not supported for this type\n";
			exit(1);
		}
	} else if (_op == "pop") {
		if( type == TypeDescriptor::NUMBERARRAY ) {
			auto narray = dynamic_cast<NumberArray*>
				(symTab.getValueFor(_id).get());
			if(narray != nullptr) {
				if(_test == nullptr)
					narray->nPop();
				else {
					auto element = _test->evaluate(symTab, funcTab);
					narray->nPopIndex(element.get());
				}
			}
		} else if(type == TypeDescriptor::STRINGARRAY) {
			auto sarray = dynamic_cast<StringArray*>
				(symTab.getValueFor(_id).get());
			if(sarray != nullptr) {
				if(_test == nullptr)
					sarray->sPop();
				else {
					auto element = _test->evaluate(symTab, funcTab);
					sarray->sPopIndex(element.get());
				}
			}
		} else {
			std::cout << "pop is not supported for this type\n";
			exit(1);
		}
	}
}