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; }
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; }
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; }
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); } }
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; }
// 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; }
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; }
/* 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; }
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; }
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; }
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; }
} } *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;
/* 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; }