diff options
| author | Michael Brown | 2008-06-13 04:36:24 +0200 |
|---|---|---|
| committer | Michael Brown | 2010-06-22 16:45:57 +0200 |
| commit | 7b4fbd93a5f45355e4e5d30e5d34c310f6d30c05 (patch) | |
| tree | 79280f7a632c413e51b588f462c512fb5c8ae898 /src/net | |
| parent | [interface] Convert all job-control interfaces to generic interfaces (diff) | |
| download | ipxe-7b4fbd93a5f45355e4e5d30e5d34c310f6d30c05.tar.gz ipxe-7b4fbd93a5f45355e4e5d30e5d34c310f6d30c05.tar.xz ipxe-7b4fbd93a5f45355e4e5d30e5d34c310f6d30c05.zip | |
[interface] Convert all name-resolution interfaces to generic interfaces
Remove name-resolution as an interface type, and replace
name-resolution interfaces with generic interfaces supporting the
resolv_done() method.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net')
| -rw-r--r-- | src/net/udp/dns.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/net/udp/dns.c b/src/net/udp/dns.c index 35ead0c74..fd1ea0a28 100644 --- a/src/net/udp/dns.c +++ b/src/net/udp/dns.c @@ -58,7 +58,7 @@ struct dns_request { /** Reference counter */ struct refcnt refcnt; /** Name resolution interface */ - struct resolv_interface resolv; + struct interface resolv; /** Data transfer interface */ struct xfer_interface socket; /** Retry timer */ @@ -93,8 +93,8 @@ static void dns_done ( struct dns_request *dns, int rc ) { xfer_nullify ( &dns->socket ); xfer_close ( &dns->socket, rc ); - /* Mark name resolution as complete */ - resolv_done ( &dns->resolv, &dns->sa, rc ); + /* Shut down interfaces */ + intf_shutdown ( &dns->resolv, rc ); } /** @@ -377,6 +377,9 @@ static int dns_xfer_deliver_raw ( struct xfer_interface *socket, sin->sin_family = AF_INET; sin->sin_addr = rr_info->a.in_addr; + /* Return resolved address */ + resolv_done ( &dns->resolv, &dns->sa ); + /* Mark operation as complete */ dns_done ( dns, 0 ); return 0; @@ -468,6 +471,15 @@ static struct xfer_interface_operations dns_socket_operations = { .deliver_raw = dns_xfer_deliver_raw, }; +/** DNS resolver interface operations */ +static struct interface_operation dns_resolv_op[] = { + INTF_OP ( intf_close, struct dns_request *, dns_done ), +}; + +/** DNS resolver interface descriptor */ +static struct interface_descriptor dns_resolv_desc = + INTF_DESC ( struct dns_request, resolv, dns_resolv_op ); + /** * Resolve name using DNS * @@ -476,7 +488,7 @@ static struct xfer_interface_operations dns_socket_operations = { * @v sa Socket address to fill in * @ret rc Return status code */ -static int dns_resolv ( struct resolv_interface *resolv, +static int dns_resolv ( struct interface *resolv, const char *name, struct sockaddr *sa ) { struct dns_request *dns; char *fqdn; @@ -504,7 +516,7 @@ static int dns_resolv ( struct resolv_interface *resolv, goto err_alloc_dns; } ref_init ( &dns->refcnt, NULL ); - resolv_init ( &dns->resolv, &null_resolv_ops, &dns->refcnt ); + intf_init ( &dns->resolv, &dns_resolv_desc, &dns->refcnt ); xfer_init ( &dns->socket, &dns_socket_operations, &dns->refcnt ); timer_init ( &dns->timer, dns_timer_expired ); memcpy ( &dns->sa, sa, sizeof ( dns->sa ) ); @@ -530,7 +542,7 @@ static int dns_resolv ( struct resolv_interface *resolv, dns_send_packet ( dns ); /* Attach parent interface, mortalise self, and return */ - resolv_plug_plug ( &dns->resolv, resolv ); + intf_plug_plug ( &dns->resolv, resolv ); ref_put ( &dns->refcnt ); free ( fqdn ); return 0; |
