コード例 #1
0
ファイル: tunnel.c プロジェクト: Psiphon-Inc/polipo
/* PSIPHON: entire function */
static int
tunnelSplitTunnelingDnsHandler(int status, GethostbynameRequestPtr request)
{
    TunnelPtr tunnel = request->data;

    if(status <= 0) {
        tunnelError(tunnel, 504,
                    internAtomError(-status,
                                    "Host %s lookup failed",
                                    atomString(tunnel->hostname)));
        return 1;
    }

    if(request->addr->string[0] == DNS_CNAME) {
        if(request->count > 10)
            tunnelError(tunnel, 504, internAtom("CNAME loop"));
        do_gethostbyname_socks(request->addr->string + 1, request->count + 1,
                         tunnelSplitTunnelingDnsHandler, tunnel);
        return 1;
    }

    //Get IP from the request, check against our local networks list
    int local_addr = 0;
    if(request->addr->string[0] == DNS_A)
    {
        HostAddressPtr host_addr;
        host_addr = (HostAddressPtr) &request->addr->string[1];
        //we deal only with IPv4 addresses
        if(host_addr->af == 4)
        {
            struct in_addr servaddr;
            memcpy(&servaddr.s_addr, &host_addr->data, sizeof(struct in_addr));
            local_addr =  isLocalAddress(servaddr);
        }
    }

    if (local_addr != 0)
    {
        printf("PSIPHON-UNPROXIED:>>%s<<", request->name->string);
        fflush(NULL);
    }

    //Use SOCKS for IPs that are not local and connect directly to the ones that are
    //At this point the DNS record for the request should be cached, default TTL for DNS requests
    //is 240 seconds
    if(local_addr == 0)
    {
            do_socks_connect(parentHost ?
                    parentHost->string : tunnel->hostname->string,
                    parentHost ? parentPort : tunnel->port,
                    tunnelSocksHandler, tunnel);
    }
    else
    {
        do_connect(retainAtom(request->addr), 0,
                parentHost ? parentPort : tunnel->port,
                tunnelConnectionHandler, tunnel);
    }
    return 1;
}
コード例 #2
0
void AbstractEARAClient::addEnergyInformationToPacket(Packet* packet) {
    if (isLocalAddress(packet->getSource()) == false) {
        // only add the energy value if this is relayed by an intermediate node
        EARAPacket* earaPacket = static_cast<EARAPacket*>(packet);
        unsigned int energyOfCurrentNode = getCurrentEnergyLevel();
        earaPacket->addEnergyValue(energyOfCurrentNode);
    }
}
コード例 #3
0
void AbstractEARAClient::updateRoutingTable(Packet* packet, NetworkInterface* interface) {
    AddressPtr source = packet->getSource();
    AddressPtr sender = packet->getSender();
    if (packet->isAntPacket() && isLocalAddress(packet->getPreviousHop()) == false
        && routingTable->isNewRoute(source, sender, interface) == false) {

        // trigger the evaporation first so this does not effect the new route or update
        routingTable->triggerEvaporation();

        // the route for this ant packet needs to be reinforced so we can completely replace the energy values
        float currentPheromoneValue = routingTable->getPheromoneValue(source, sender, interface);
        float newPheromoneValue = pathReinforcementPolicy->calculateReinforcedValue(currentPheromoneValue);

        float newEnergyValue = calculateInitialEnergyValue(static_cast<EARAPacket*>(packet));
        routingTable->update(source, sender, interface, newPheromoneValue, newEnergyValue);
    }
    else {
        AbstractARAClient::updateRoutingTable(packet, interface);
    }
}
コード例 #4
0
int FBtnCalc::PositionRun( QVector<RealFde>& frames_ltrb, QVector<RealFde>& frames_margin_ltrb, QVector<RealFde>& primitive_ltrb )
{
	int ret = 0;

	//////////////////////////////
	// Use Calculation Scheme
	//////////////////////////////

	//QVector<double> ev_stack;
	MArray<double> ev_stack(64, 0, 64);
	long ev_stack_top = 0;
	FBtnPiCode *cmd;

	for( long i = 0; i < size(); i++ )
	{
		cmd = &((*this)[i]);
		switch( cmd->command )
		{
		case LPC_ASIGN:
			if( isLocalAddress( cmd->frame_var.first ) )
			{
				ret = isParentMarginAddr( cmd->frame_var.second );
				locals[ cmd->frame_var.second ] = (RealFde) ev_stack[ --ev_stack_top ];
			}
			else if( isPrimitiveAddress( cmd->frame_var.first ) )
				primitive_ltrb[ (- cmd->frame_var.first - 1) * 4 + cmd->frame_var.second ] = (RealFde) ev_stack[ --ev_stack_top ];
			else if( isFrameAddress( cmd->frame_var.first ) && isMargin( cmd->frame_var.second ) )
			{
				frames_margin_ltrb[ (cmd->frame_var.first - 1) * 4 + (cmd->frame_var.second + 4) ] = (RealFde) ev_stack[ --ev_stack_top ];
				ret = 1;
			}
			break;
		case LPC_POP:
			--ev_stack_top;
			break;
		case LPC_PUSH:
			if( isFrameAddress( cmd->frame_var.first ) )
			{
				if( isMargin( cmd->frame_var.second ) )
					ev_stack[ ev_stack_top++ ] = 
						frames_margin_ltrb[ (cmd->frame_var.first - 1) * 4 + (cmd->frame_var.second + 4) ];
				else
					ev_stack[ ev_stack_top++ ] = 
						frames_ltrb[ (cmd->frame_var.first - 1) * 4 + cmd->frame_var.second ];
			}
			else if( isLocalAddress( cmd->frame_var.first ) )
				ev_stack[ ev_stack_top++ ] = locals[ cmd->frame_var.second ];
			else if( isPrimitiveAddress( cmd->frame_var.first ) )
				ev_stack[ ev_stack_top++ ] = primitive_ltrb[ (- cmd->frame_var.first - 1) * 4 + cmd->frame_var.second ];
			break;
		case LPC_PUSHVAL:
			ev_stack[ ev_stack_top++ ] = cmd->val;
			break;
		case LPC_MINUS:
			ev_stack[ ev_stack_top - 1 ] = - ev_stack[ ev_stack_top - 1 ];
			break;
		case LPC_ADD:
			ev_stack_top--;
			ev_stack[ ev_stack_top - 1 ] = ev_stack[ ev_stack_top - 1 ] + ev_stack[ ev_stack_top ];
			break;
		case LPC_SUB:
			ev_stack_top--;
			ev_stack[ ev_stack_top - 1 ] = ev_stack[ ev_stack_top - 1 ] - ev_stack[ ev_stack_top ];
			break;
		case LPC_MUL:
			ev_stack_top--;
			ev_stack[ ev_stack_top - 1 ] = ev_stack[ ev_stack_top - 1 ] * ev_stack[ ev_stack_top ];
			break;
		case LPC_DIV:
			ev_stack_top--;
			ev_stack[ ev_stack_top - 1 ] = ev_stack[ ev_stack_top - 1 ] / ev_stack[ ev_stack_top ];
			break;
		case LPC_AVERAGE:
			ev_stack_top--;
			ev_stack[ ev_stack_top - 1 ] = (ev_stack[ ev_stack_top - 1 ] + ev_stack[ ev_stack_top ]) / 2.0;
			break;
		case LPC_MIN:
			ev_stack_top--;
			ev_stack[ ev_stack_top - 1 ] = ev_stack[ ev_stack_top - 1 ] > ev_stack[ ev_stack_top ] ?
					ev_stack[ ev_stack_top ] : ev_stack[ ev_stack_top - 1 ];
			break;
		case LPC_MAX:
			ev_stack_top--;
			ev_stack[ ev_stack_top - 1 ] = ev_stack[ ev_stack_top - 1 ] > ev_stack[ ev_stack_top ] ?
					ev_stack[ ev_stack_top - 1 ] : ev_stack[ ev_stack_top ];
			break;
		default:
			break;
		}
	}

	return ret;
}
コード例 #5
0
ファイル: sad-coll.c プロジェクト: KuanYuChen/mansos
RoutingDecision_e routePacket(MacInfo_t *info)
{
    MosAddr *dst = &info->originalDst;

    // PRINTF("route: dst address=0x%04x, nexthop=0x%04x\n", dst->shortAddr, info->immedDst.shortAddr);
    // PRINTF("  localAddress=0x%04x\n", localAddress);

    if (IS_LOCAL(info)) {
        // fix root address if we are sending it to the root
        if (dst->shortAddr == MOS_ADDR_ROOT) {
            intToAddr(info->originalDst, rootAddress);
            // info->hoplimit = hopCountToRoot;
            info->hoplimit = MAX_HOP_COUNT;
        }
    } else {
//        PRINTF("route packet, addr=0x%04x port=%02x\n", dst->shortAddr, info->dstPort);
        uint8_t index = markAsSeen(info->immedSrc.shortAddr, false);
        if (index != 0xff) {
            uint32_t expectedTimeStart = 4000ul + MOTE_TIME_FULL * index + MOTE_TIME
                    + (IS_ODD_COLLECTOR ? MOTE_TIME_FULL * MAX_MOTES : 0);
            uint32_t expectedTimeEnd = expectedTimeStart + MOTE_TIME;
            uint32_t now = timeSinceFrameStart();
            if (now < expectedTimeStart || now > expectedTimeEnd) {
                TPRINTF("*** mote %#04x sends out of its time: expected at %lu (+0-512 ms), now %lu!\n",
                        motes[index].address, expectedTimeStart, now);
            }
        } else {
            if (timeSinceFrameStart() > 4000) {
                TPRINTF("*** unregistered sender!\n");
            }
        }
    }

    if (isLocalAddress(dst)) {
        INC_NETSTAT(NETSTAT_PACKETS_RECV, info->originalSrc.shortAddr);
        return RD_LOCAL;
    }
    if (isBroadcast(dst)) {
        fillLocalAddress(&info->immedSrc); // XXX
        if (!IS_LOCAL(info)){
            INC_NETSTAT(NETSTAT_PACKETS_RECV, info->originalSrc.shortAddr);
        }
        // don't forward broadcast packets
        return IS_LOCAL(info) ? RD_BROADCAST : RD_LOCAL;
    }

    // check if hop limit allows the packet to be forwarded
    if (!checkHoplimit(info)) {
        PRINTF("hoplimit reached!\n");
        return RD_DROP;
    }

    // fill address: may forward it
    fillLocalAddress(&info->immedSrc);

    if (dst->shortAddr == rootAddress) {
        if (isRoutingInfoValid()) {
            //PRINTF("using 0x%04x as nexthop to root\n", nexthopToRoot);
            if (!IS_LOCAL(info)) {
#if PRECONFIGURED_NH_TO_ROOT
                if (info->immedDst.shortAddr != localAddress) {
                    TPRINTF("Dropping, I'm not a nexthop for sender %#04x\n",
                            info->originalSrc.shortAddr);
                    INC_NETSTAT(NETSTAT_PACKETS_DROPPED_RX, EMPTY_ADDR);
                    return RD_DROP;
                }
#endif
                // if (info->hoplimit < hopCountToRoot){
                //     PRINTF("Dropping, can't reach host with left hopCounts\n");
                //     return RD_DROP;
                // } 
                TPRINTF("****** Forwarding a packet to root for %#04x!\n",
                        info->originalSrc.shortAddr);
                INC_NETSTAT(NETSTAT_PACKETS_FWD, nexthopToRoot);
                // delay a bit
                info->timeWhenSend = getSyncTimeMs() + randomNumberBounded(150);
            } else{
                //INC_NETSTAT(NETSTAT_PACKETS_SENT, nexthopToRoot);     // Done @ comm.c
            }
            info->immedDst.shortAddr = nexthopToRoot;
            return RD_UNICAST;
        } else {
            // PRINTF("root routing info not present or expired!\n");
            TPRINTF("DROP\n");
            return RD_DROP;
        }
    }

    if (IS_LOCAL(info)) {
        //INC_NETSTAT(NETSTAT_PACKETS_SENT, dst->shortAddr);        // Done @ comm.c
        // send out even with an unknown nexthop, makes sense?
        return RD_UNICAST;
    }
    return RD_DROP;
}