static void dns_send(void) { struct header *header; int n, name_len; uchar *p, *pkt; const char *s; const char *name; enum dns_query_type qtype = DNS_A_RECORD; name = net_dns_resolve; pkt = (uchar *)(net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE); p = pkt; /* Prepare DNS packet header */ header = (struct header *)pkt; header->tid = 1; header->flags = htons(0x100); /* standard query */ header->nqueries = htons(1); /* Just one query */ header->nanswers = 0; header->nauth = 0; header->nother = 0; /* Encode DNS name */ name_len = strlen(name); p = (uchar *)&header->data; /* For encoding host name into packet */ do { s = strchr(name, '.'); if (!s) s = name + name_len; n = s - name; /* Chunk length */ *p++ = n; /* Copy length */ memcpy(p, name, n); /* Copy chunk */ p += n; if (*s == '.') n++; name += n; name_len -= n; } while (*s != '\0'); *p++ = 0; /* Mark end of host name */ *p++ = 0; /* Some servers require double null */ *p++ = (unsigned char) qtype; /* Query Type */ *p++ = 0; *p++ = 1; /* Class: inet, 0x0001 */ n = p - pkt; /* Total packet length */ debug("Packet size %d\n", n); dns_our_port = random_port(); net_send_udp_packet(net_server_ethaddr, net_dns_server, DNS_SERVICE_PORT, dns_our_port, n); debug("DNS packet sent\n"); }
static void nc_send_packet(const char *buf, int len) { #ifdef CONFIG_DM_ETH struct udevice *eth; #else struct eth_device *eth; #endif int inited = 0; uchar *pkt; uchar *ether; struct in_addr ip; debug_cond(DEBUG_DEV_PKT, "output: \"%*.*s\"\n", len, len, buf); eth = eth_get_dev(); if (eth == NULL) return; if (!memcmp(nc_ether, net_null_ethaddr, 6)) { if (eth_is_active(eth)) return; /* inside net loop */ output_packet = buf; output_packet_len = len; input_recursion = 1; net_loop(NETCONS); /* wait for arp reply and send packet */ input_recursion = 0; output_packet_len = 0; return; } if (!eth_is_active(eth)) { if (eth_is_on_demand_init()) { if (eth_init() < 0) return; eth_set_last_protocol(NETCONS); } else { eth_init_state_only(); } inited = 1; } pkt = (uchar *)net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE; memcpy(pkt, buf, len); ether = nc_ether; ip = nc_ip; net_send_udp_packet(ether, ip, nc_out_port, nc_in_port, len); if (inited) { if (eth_is_on_demand_init()) eth_halt(); else eth_halt_state_only(); } }
/** * Called from net_loop in net/net.c before each packet */ void nc_start(void) { refresh_settings_from_env(); if (!output_packet_len || memcmp(nc_ether, net_null_ethaddr, 6)) { /* going to check for input packet */ net_set_udp_handler(nc_handler); net_set_timeout_handler(net_timeout, nc_timeout_handler); } else { /* send arp request */ uchar *pkt; net_set_arp_handler(nc_wait_arp_handler); pkt = (uchar *)net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE; memcpy(pkt, output_packet, output_packet_len); net_send_udp_packet(nc_ether, nc_ip, nc_out_port, nc_in_port, output_packet_len); } }