Ejemplo n.º 1
0
int nettest1(void)
{
	int err;
	sockaddr addr;

	fd = socket_create(SOCK_PROTO_TCP, 0);
	printf("created socket, fd %d\n", fd);
	if(fd < 0)
		return 0;

	memset(&addr, 0, sizeof(addr));
	addr.addr.len = 4;
	addr.addr.type = ADDR_TYPE_IP;
//	addr.port = 19;
//	NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(63,203,215,73);
//	addr.port = 23;
//	NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(192,168,0,3);
	addr.port = 6667;
	NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(209,131,227,242);

	err = socket_connect(fd, &addr);
	printf("socket_connect returns %d\n", err);
	if(err < 0)
		return err;

	exit_sem = _kern_sem_create(0, "exit");

	_kern_thread_resume_thread(_kern_thread_create_thread("read_thread", &read_thread, NULL));
	_kern_thread_resume_thread(_kern_thread_create_thread("write_thread", &write_thread, NULL));

	for(;;)
		_kern_sem_acquire(exit_sem, 1);

	return 0;
}
Ejemplo n.º 2
0
int nettest2(void)
{
	int err;
	sockaddr addr;

	fd = socket_create(SOCK_PROTO_TCP, 0);
	printf("created socket, fd %d\n", fd);
	if(fd < 0)
		return 0;

	memset(&addr, 0, sizeof(addr));
	addr.addr.len = 4;
	addr.addr.type = ADDR_TYPE_IP;
	addr.port = 9;
	NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(63,203,215,73);

	err = socket_connect(fd, &addr);
	printf("socket_connect returns %d\n", err);
	if(err < 0)
		return err;

	for(;;) {
		char buf[4096];
		socket_write(fd, buf, sizeof(buf));
	}
	return 0;
}
Ejemplo n.º 3
0
int nettest4(void)
{
	int err;
	sockaddr addr;

	fd = socket_create(SOCK_PROTO_TCP, 0);
	printf("created socket, fd %d\n", fd);
	if(fd < 0)
		return 0;

	memset(&addr, 0, sizeof(addr));
	addr.addr.len = 4;
	addr.addr.type = ADDR_TYPE_IP;
	addr.port = 1900;
	NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(63,203,215,73);

	err = socket_connect(fd, &addr);
	printf("socket_connect returns %d\n", err);
	if(err < 0)
		return err;

	usleep(5000000);

	err = socket_close(fd);
	printf("socket_close returns %d\n", err);

	return 0;
}
Ejemplo n.º 4
0
int nettest6(void)
{
	int err;
	sockaddr addr;
	int new_fd;

	fd = socket_create(SOCK_PROTO_TCP, 0);
	printf("created socket, fd %d\n", fd);
	if(fd < 0)
		return 0;

	memset(&addr, 0, sizeof(addr));
	addr.addr.len = 4;
	addr.addr.type = ADDR_TYPE_IP;
	addr.port = 1900;
	NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(0,0,0,0);

	err = socket_bind(fd, &addr);
	printf("socket_bind returns %d\n", err);
	if(err < 0)
		return 0;

	err = socket_listen(fd);
	printf("socket_listen returns %d\n", err);
	if(err < 0)
		return 0;

	for(;;) {
		int saved_stdin, saved_stdout, saved_stderr;
		char *argv;

		new_fd = socket_accept(fd, &addr);
		printf("socket_accept returns %d\n", new_fd);
		if(new_fd < 0)
			continue;

		saved_stdin = dup(0);
		saved_stdout = dup(1);
		saved_stderr = dup(2);

		dup2(new_fd, 0);
		dup2(new_fd, 1);
		dup2(new_fd, 2);
		close(new_fd);

		// XXX launch
		argv = "/boot/bin/shell";
		err = _kern_proc_create_proc("/boot/bin/shell", "shell", &argv, 1, 5, 0);

		dup2(saved_stdin, 0);
		dup2(saved_stdout, 1);
		dup2(saved_stderr, 2);
		close(saved_stdin);
		close(saved_stdout);
		close(saved_stderr);
		printf("_kern_proc_create_proc returns %d\n", err);
	}
}
Ejemplo n.º 5
0
static errno_t
bootprecv( struct bootp_state *bstate, void *udp_sock, struct bootp *bp, size_t len, size_t *retlen )
{
    SHOW_FLOW0( 3, "bootp_recv");

    sockaddr dest_addr;
    dest_addr.port = IPPORT_BOOTPS; // dest port

    dest_addr.addr.len = 4;
    dest_addr.addr.type = ADDR_TYPE_IP;
    // INADDR_BROADCAST
    //NETADDR_TO_IPV4(dest_addr.addr) = IPV4_DOTADDR_TO_ADDR(0xFF, 0xFF, 0xFF, 0xFF);
    NETADDR_TO_IPV4(dest_addr.addr) = IPV4_DOTADDR_TO_ADDR(0, 0, 0, 0);

    int n = udp_recvfrom(udp_sock, bp, len, &dest_addr, SOCK_FLAG_TIMEOUT, 2000000l);

    if( 0 >= n )
    {
        SHOW_ERROR( 0, "UDP recv err = %d", n);
        return ETIMEDOUT; // TODO errno
    }

    if (n == -1 || n < (int)(sizeof(struct bootp) - BOOTP_VENDSIZE))
        goto bad;

    SHOW_FLOW( 3, "bootprecv: recv %d bytes", n);

    if (bp->bp_xid != htonl(xid)) {
        SHOW_ERROR( 1, "bootprecv: expected xid 0x%x, got 0x%x",
                   xid, ntohl(bp->bp_xid));
        goto bad;
    }

    SHOW_FLOW0( 3, "bootprecv: got one!");

    /* Suck out vendor info */
    if (bcmp(vm_rfc1048, bp->bp_vend, sizeof(vm_rfc1048)) == 0) {
        if(vend_rfc1048(bstate, bp->bp_vend, sizeof(bp->bp_vend)) != 0)
            goto bad;
    }
#ifdef BOOTP_VEND_CMU
    else if (bcmp(vm_cmu, bp->bp_vend, sizeof(vm_cmu)) == 0)
        vend_cmu(bstate,bp->bp_vend);
#endif
    else
        SHOW_ERROR( 0, "bootprecv: unknown vendor 0x%lx", (long)bp->bp_vend);

    if(retlen) *retlen = n;

    return 0;
bad:
    //errno = 0;
    return EINVAL;
}
Ejemplo n.º 6
0
// Create a file struct for given path
static uufile_t *  httpfs_namei(uufs_t *fs, const char *filename)
{
    int ip0, ip1, ip2, ip3, port;

    (void) fs;

    if( 5 != sscanf( filename, "%d.%d.%d.%d:%d", &ip0, &ip1, &ip2, &ip3, &port ) )
    {
        return 0;
    }

    sockaddr addr;
    addr.port = port;

    addr.addr.len = 4;
    addr.addr.type = ADDR_TYPE_IP;
    NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(ip0, ip2, ip2, ip3);

    struct uusocket *us = calloc(1, sizeof(struct uusocket));
    if(us == 0)  return 0;

    us->addr = addr;


    if( tcp_open(&(us->prot_data)) )
    {
        SHOW_ERROR0(0, "can't prepare endpoint");
fail:
        free(us);
        return 0;
    }

    if( tcp_connect( us->prot_data, &us->addr) )
    {
        SHOW_ERROR(0, "can't connect to %s", filename);
        goto fail;
    }


    uufile_t *ret = create_uufile();

    ret->ops = &httpfs_fops;

    ret->pos = 0;
    ret->fs = &http_fs;
    ret->impl = us;
    ret->flags = UU_FILE_FLAG_NET|UU_FILE_FLAG_TCP|UU_FILE_FLAG_OPEN; // TODO wrong! open in open!

    return ret;
}
Ejemplo n.º 7
0
int nettest5(void)
{
	int err;
	sockaddr addr;
	int new_fd;

	fd = socket_create(SOCK_PROTO_TCP, 0);
	printf("created socket, fd %d\n", fd);
	if(fd < 0)
		return 0;

	memset(&addr, 0, sizeof(addr));
	addr.addr.len = 4;
	addr.addr.type = ADDR_TYPE_IP;
	addr.port = 1900;
	NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(0,0,0,0);

	err = socket_bind(fd, &addr);
	printf("socket_bind returns %d\n", err);
	if(err < 0)
		return 0;

	err = socket_listen(fd);
	printf("socket_listen returns %d\n", err);
	if(err < 0)
		return 0;

	new_fd = socket_accept(fd, &addr);
	printf("socket_accept returns %d\n", new_fd);
	if(new_fd < 0)
		return 0;

	err = socket_write(new_fd, "hello world!\n", strlen("hello world!\n"));
	printf("socket_write returns %d\n", err);

	printf("sleeping for 5 seconds\n");
	usleep(5000000);

	printf("closing fd %d\n", new_fd);
	socket_close(new_fd);
	printf("closing fd %d\n", fd);
	socket_close(fd);

	return 0;
}
Ejemplo n.º 8
0
/* Transmit a bootp request */
static ssize_t
bootpsend(struct bootp_state *bstate, void *udp_sock, struct bootp *bp, size_t len)
{
    bp->bp_secs = htons((u_short)(time(0) - bstate->bot));

    SHOW_FLOW0( 3, "bootpsend: calling sendudp" );

    sockaddr dest_addr;
    dest_addr.port = IPPORT_BOOTPS; // dest port

    dest_addr.addr.len = 4;
    dest_addr.addr.type = ADDR_TYPE_IP;
    // INADDR_BROADCAST
    NETADDR_TO_IPV4(dest_addr.addr) = IPV4_DOTADDR_TO_ADDR(0xFF, 0xFF, 0xFF, 0xFF);

    int rc = udp_sendto(udp_sock, bp, len, &dest_addr);
    if( 0 != rc )
    {
        SHOW_ERROR( 0, "can't send UDP, rc = %d", rc);
        return -1;
    }

    return 0;
}
Ejemplo n.º 9
0
static int connect_trfs(void)
{
    if( udp_open(&trfs_socket) )
    {
        SHOW_ERROR0( 0, "UDP trfs - can't open endpoint");
        return -1;
    }

    trfs_addr.port = TRFS_PORT; // local port to be the same

    trfs_addr.addr.len = 4;
    trfs_addr.addr.type = ADDR_TYPE_IP;
    NETADDR_TO_IPV4(trfs_addr.addr) = IPV4_DOTADDR_TO_ADDR(192, 168, 1, 106);

    int rc;
    if( 0 != (rc = udp_bind(trfs_socket, &trfs_addr)) )
        return rc;

    trfs_addr.port = TRFS_PORT; // Remote port

    SHOW_FLOW0( 1, "started" );

    return 0;
}
Ejemplo n.º 10
0
int nettest3(void)
{
	int err;
	sockaddr addr;

	fd = socket_create(SOCK_PROTO_TCP, 0);
	printf("created socket, fd %d\n", fd);
	if(fd < 0)
		return 0;

	memset(&addr, 0, sizeof(addr));
	addr.addr.len = 4;
	addr.addr.type = ADDR_TYPE_IP;
	addr.port = 1900;
	NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(63,203,215,73);

	err = socket_connect(fd, &addr);
	printf("socket_connect returns %d\n", err);
	if(err < 0)
		return err;

	for(;;) {
		char buf[4096];
		ssize_t len;

		len = socket_read(fd, buf, sizeof(buf));
		printf("socket_read returns %ld\n", len);
		if(len <= 0)
			break;
	}

	err = socket_close(fd);
	printf("socket_close returns %d\n", err);

	return 0;
}
Ejemplo n.º 11
0
errno_t name2ip( in_addr_t *out, const char *name, int flags )
{
    int    ia, ib, ic, id;
    if( 4 == sscanf( name, "%d.%d.%d.%d", &ia, &ib, &ic, &id ) )
    {
        // No resolver required, ip4 addr given
        ipv4_addr iaddr = IPV4_DOTADDR_TO_ADDR( ia, ib, ic, id);
        *out = htonl( iaddr );
        SHOW_FLOW( 2, "parsed %s to %s", name, inet_ntoa(* (struct in_addr*)out) );
        return 0;
    }

    if(!inited)
        return ENXIO;

    int tries = 20;

    if(flags & RESOLVER_FLAG_NORETRY)
        tries = 1;

    ipv4_addr 	result;
    //ipv4_addr 	next_servers[MAX_DNS_SERVERS];

    SHOW_FLOW( 1, "request '%s'", name );

    ipv4_addr *	sptr = servers;
    int         sleft = MAX_DNS_SERVERS;

    if( !(flags & RESOLVER_FLAG_NORCACHE) )
        if( lookup_cache( out, name ) == 0 )
        {
            SHOW_FLOW0( 1, "got from cache");
            return 0;
        }

    // On OS stop don't produce network traffic
    if( (flags & RESOLVER_FLAG_NOWAIT) || phantom_stop_level )
        return ESRCH;

    while(tries--)
    {
        ipv4_addr 	server = *sptr++;

        if(sleft-- <= 0 || server == 0)
        {
            SHOW_ERROR0( 1, "No more places to look in, give up\n");
            return ENOENT;
        }

        SHOW_FLOW( 2, "look in %s", inet_ntoa(* (struct in_addr*)&server) );
        errno_t res = dns_request( (const unsigned char *)name, server, &result );

        if( res == 0 )//|| result != 0 )
        {
            SHOW_FLOW( 1, "answer is %s", inet_ntoa(* (struct in_addr*)&result) );
            *out = result;
            if( !(flags & RESOLVER_FLAG_NOWCACHE) )
                store_to_cache( result, name );
            return 0;
        }
    }

    return ENOENT;
}
Ejemplo n.º 12
0
        }
    }

    *dns++= FIN;
}






#define MAX_DNS_SERVERS 32

static ipv4_addr servers[MAX_DNS_SERVERS] =
{
    IPV4_DOTADDR_TO_ADDR(1, 1, 168, 192),
    IPV4_DOTADDR_TO_ADDR(1, 0, 168, 192),
    IPV4_DOTADDR_TO_ADDR(8, 8, 8, 8),
    IPV4_DOTADDR_TO_ADDR(4, 4, 8, 8),
};


ipv4_addr ngethostbyname(unsigned char *host)
{
    int tries = 20;

    ipv4_addr 	result;
    //ipv4_addr 	next_servers[MAX_DNS_SERVERS];

    ipv4_addr *	sptr = servers;
    int         sleft = MAX_DNS_SERVERS;
Ejemplo n.º 13
0
/* Fetch required bootp infomation */
static errno_t do_bootp(struct bootp_state *bstate, void *udp_sock, int flag)
{
    struct bootp *bp;

    struct {
        //u_char header[HEADER_SIZE];
        struct bootp wbootp;
    } wbuf;

    struct {
        //u_char header[HEADER_SIZE];
        struct bootp rbootp;
    } rbuf;

    SHOW_FLOW0( 3, "bootp start");

    if (!bstate->bot)
        bstate->bot = time(0);



    bp = &wbuf.wbootp;
    bzero(bp, sizeof(*bp));

    bp->bp_op = BOOTREQUEST;
    bp->bp_htype = 1;		/* 10Mb Ethernet (48 bits) */
    bp->bp_hlen = 6;
    bp->bp_xid = htonl(xid);

    //MACPY(d->myea, bp->bp_chaddr);
    memcpy( bp->bp_chaddr, bstate->mac_addr, 6 );

    //strncpy(bp->bp_file, bootfile, sizeof(bp->bp_file));
    bcopy(vm_rfc1048, bp->bp_vend, sizeof(vm_rfc1048));
#ifdef SUPPORT_DHCP
    bp->bp_vend[4] = TAG_DHCP_MSGTYPE;
    bp->bp_vend[5] = 1;
    bp->bp_vend[6] = DHCPDISCOVER;

    /*
     * If we are booting from PXE, we want to send the string
     * 'PXEClient' to the DHCP server so you have the option of
     * only responding to PXE aware dhcp requests.
     */
    if (flag & BOOTP_PXE) {
        bp->bp_vend[7] = TAG_CLASSID;
        bp->bp_vend[8] = 9;
        bcopy("PXEClient", &bp->bp_vend[9], 9);
        bp->bp_vend[18] = TAG_END;
    } else
        bp->bp_vend[7] = TAG_END;
#else
    bp->bp_vend[4] = TAG_END;
#endif

    //d->myip.s_addr = INADDR_ANY;
    //d->myport = htons(IPPORT_BOOTPC);
    //d->destip.s_addr = INADDR_BROADCAST;
    //d->destport = htons(IPPORT_BOOTPS);

#ifdef SUPPORT_DHCP
    bstate->expected_dhcpmsgtype = DHCPOFFER;
    bstate->dhcp_ok = 0;
#endif


    sockaddr src_addr;
    src_addr.port = IPPORT_BOOTPC; // local port

    src_addr.addr.len = 4;
    src_addr.addr.type = ADDR_TYPE_IP;
    // INADDR_ANY
    NETADDR_TO_IPV4(src_addr.addr) = IPV4_DOTADDR_TO_ADDR(0, 0, 0, 0);

    if( 0 != udp_bind(udp_sock, &src_addr) )
    {
        SHOW_ERROR0( 0, "can't bind UDP address");
        return ENOTCONN;
    }

    /*
    sockaddr dest_addr;
    dest_addr.port = IPPORT_BOOTPS; // dest port

    dest_addr.addr.len = 4;
    dest_addr.addr.type = ADDR_TYPE_IP;
    // INADDR_BROADCAST
    NETADDR_TO_IPV4(dest_addr.addr) = IPV4_DOTADDR_TO_ADDR(0xFF, 0xFF, 0xFF, 0xFF);
    */

    errno_t rc;

    //if( 0 != udp_sendto(udp_sock, bp, sizeof(*bp), &dest_addr) )
    if( 0 != bootpsend(bstate, udp_sock, bp, sizeof(*bp)) )
    {
        SHOW_ERROR0( 0, "can't send UDP packet");
        return ECONNREFUSED;
    }

    //if( 0 >= udp_recvfrom(udp_sock, &rbuf.rbootp, sizeof(rbuf.rbootp), &dest_addr, SOCK_FLAG_TIMEOUT, 1000000l) )
    rc = bootprecv(bstate, udp_sock, &rbuf.rbootp, sizeof(rbuf.rbootp), 0 );
    if(rc)
    {
        SHOW_ERROR( 0, "no reply, rc = %d", rc);
        return rc;
    }




    /*
    if(sendrecv(d,
                bootpsend, bp, sizeof(*bp),
                bootprecv, &rbuf.rbootp, sizeof(rbuf.rbootp))
       == -1) {
        SHOW_ERROR0( 0, "no reply");
        return;
    }*/

#ifdef SUPPORT_DHCP
    if(bstate->dhcp_ok)
    {
        u_int32_t leasetime;
        bp->bp_vend[6] = DHCPREQUEST;
        bp->bp_vend[7] = TAG_REQ_ADDR;
        bp->bp_vend[8] = 4;
        bcopy(&rbuf.rbootp.bp_yiaddr, &bp->bp_vend[9], 4);
        bp->bp_vend[13] = TAG_SERVERID;
        bp->bp_vend[14] = 4;
        bcopy(&bstate->dhcp_serverip.s_addr, &bp->bp_vend[15], 4);
        bp->bp_vend[19] = TAG_LEASETIME;
        bp->bp_vend[20] = 4;
        leasetime = htonl(300);
        bcopy(&leasetime, &bp->bp_vend[21], 4);
        if (flag & BOOTP_PXE) {
            bp->bp_vend[25] = TAG_CLASSID;
            bp->bp_vend[26] = 9;
            bcopy("PXEClient", &bp->bp_vend[27], 9);
            bp->bp_vend[36] = TAG_END;
        } else
            bp->bp_vend[25] = TAG_END;

        bstate->expected_dhcpmsgtype = DHCPACK;


        if( 0 != bootpsend(bstate, udp_sock, bp, sizeof(*bp)) )
        {
            SHOW_ERROR0( 0, "can't send UDP 2");
            return ECONNREFUSED;
        }

        //if( 0 >= udp_recvfrom(udp_sock, &rbuf.rbootp, sizeof(rbuf.rbootp), &dest_addr, SOCK_FLAG_TIMEOUT, 1000000l) )
        if( bootprecv(bstate, udp_sock, &rbuf.rbootp, sizeof(rbuf.rbootp), 0) )
        {
            SHOW_ERROR0( 0, "no reply");
            return ETIMEDOUT;
        }


        /*
        if(sendrecv(d,
                    bootpsend, bp, sizeof(*bp),
                    bootprecv, &rbuf.rbootp, sizeof(rbuf.rbootp))
           == -1) {
            SHOW_ERROR0( 0, "DHCPREQUEST failed");
            return;
        }*/
    }
#endif

    bstate->myip = rbuf.rbootp.bp_yiaddr;
    bstate->servip = rbuf.rbootp.bp_siaddr;
    //if(rootip.s_addr == INADDR_ANY) rootip = servip;
    bcopy(rbuf.rbootp.bp_file, bstate->bootfile, sizeof(bstate->bootfile));
    bstate->bootfile[sizeof(bstate->bootfile) - 1] = '\0';

    /*
    if (IN_CLASSA(ntohl(myip.s_addr)))
        nmask = htonl(IN_CLASSA_NET);
    else if (IN_CLASSB(ntohl(myip.s_addr)))
        nmask = htonl(IN_CLASSB_NET);
    else
        nmask = htonl(IN_CLASSC_NET);

    SHOW_FLOW( 1, "'native netmask' is %s", intoa(nmask));

    // Check subnet mask against net mask; toss if bogus
    if ((nmask & smask) != nmask) {
        SHOW_ERROR( 1, "subnet mask (%s) bad", intoa(smask));
        smask = 0;
    }
    */

    /* Get subnet (or natural net) mask
    netmask = nmask;
    if (smask)
    netmask = smask;
    */

    //SHOW_FLOW( 1, "mask: %s", intoa(smask));

    /* We need a gateway if root is on a different net * /
    if (!SAMENET(myip, rootip, netmask)) {
        SHOW_FLOW( 1, "need gateway for root ip");
    }

    / * Toss gateway if on a different net * /
    if (!SAMENET(myip, gateip, netmask)) {
        SHOW_FLOW( 1, "gateway ip (%s) bad", inet_ntoa(gateip));
        gateip.s_addr = 0;
    } */

    /* Bump xid so next request will be unique. */
    ++xid;

    return 0;
}