mirror of
https://github.com/ipxe/ipxe
synced 2026-02-14 02:31:26 +03:00
Kill off hotplug.h and just make net devices normal reference-counted
structures. DHCP still broken and #if 0'd out.
This commit is contained in:
@@ -265,19 +265,6 @@ struct net_protocol aoe_protocol __net_protocol = {
|
||||
.rx = aoe_rx,
|
||||
};
|
||||
|
||||
/**
|
||||
* Forget reference to net_device
|
||||
*
|
||||
* @v ref Persistent reference
|
||||
*/
|
||||
static void aoe_forget_netdev ( struct reference *ref ) {
|
||||
struct aoe_session *aoe
|
||||
= container_of ( ref, struct aoe_session, netdev_ref );
|
||||
|
||||
aoe->netdev = NULL;
|
||||
ref_del ( &aoe->netdev_ref );
|
||||
}
|
||||
|
||||
/**
|
||||
* Open AoE session
|
||||
*
|
||||
@@ -288,8 +275,6 @@ void aoe_open ( struct aoe_session *aoe ) {
|
||||
sizeof ( aoe->target ) );
|
||||
aoe->tag = AOE_TAG_MAGIC;
|
||||
aoe->timer.expired = aoe_timer_expired;
|
||||
aoe->netdev_ref.forget = aoe_forget_netdev;
|
||||
ref_add ( &aoe->netdev_ref, &aoe->netdev->references );
|
||||
list_add ( &aoe->list, &aoe_sessions );
|
||||
}
|
||||
|
||||
@@ -299,8 +284,6 @@ void aoe_open ( struct aoe_session *aoe ) {
|
||||
* @v aoe AoE session
|
||||
*/
|
||||
void aoe_close ( struct aoe_session *aoe ) {
|
||||
if ( aoe->netdev )
|
||||
ref_del ( &aoe->netdev_ref );
|
||||
list_del ( &aoe->list );
|
||||
}
|
||||
|
||||
|
||||
@@ -30,8 +30,6 @@ struct list_head ipv4_miniroutes = LIST_HEAD_INIT ( ipv4_miniroutes );
|
||||
/** List of fragment reassembly buffers */
|
||||
static LIST_HEAD ( frag_buffers );
|
||||
|
||||
static void ipv4_forget_netdev ( struct reference *ref );
|
||||
|
||||
/**
|
||||
* Add IPv4 minirouting table entry
|
||||
*
|
||||
@@ -61,7 +59,7 @@ static struct ipv4_miniroute * add_ipv4_miniroute ( struct net_device *netdev,
|
||||
}
|
||||
|
||||
/* Record routing information */
|
||||
miniroute->netdev = netdev;
|
||||
miniroute->netdev = netdev_get ( netdev );
|
||||
miniroute->address = address;
|
||||
miniroute->netmask = netmask;
|
||||
miniroute->gateway = gateway;
|
||||
@@ -75,10 +73,6 @@ static struct ipv4_miniroute * add_ipv4_miniroute ( struct net_device *netdev,
|
||||
list_add ( &miniroute->list, &ipv4_miniroutes );
|
||||
}
|
||||
|
||||
/* Record reference to net_device */
|
||||
miniroute->netdev_ref.forget = ipv4_forget_netdev;
|
||||
ref_add ( &miniroute->netdev_ref, &netdev->references );
|
||||
|
||||
return miniroute;
|
||||
}
|
||||
|
||||
@@ -95,23 +89,11 @@ static void del_ipv4_miniroute ( struct ipv4_miniroute *miniroute ) {
|
||||
DBG ( "gw %s ", inet_ntoa ( miniroute->gateway ) );
|
||||
DBG ( "via %s\n", miniroute->netdev->name );
|
||||
|
||||
ref_del ( &miniroute->netdev_ref );
|
||||
netdev_put ( miniroute->netdev );
|
||||
list_del ( &miniroute->list );
|
||||
free ( miniroute );
|
||||
}
|
||||
|
||||
/**
|
||||
* Forget reference to net_device
|
||||
*
|
||||
* @v ref Persistent reference
|
||||
*/
|
||||
static void ipv4_forget_netdev ( struct reference *ref ) {
|
||||
struct ipv4_miniroute *miniroute
|
||||
= container_of ( ref, struct ipv4_miniroute, netdev_ref );
|
||||
|
||||
del_ipv4_miniroute ( miniroute );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add IPv4 interface
|
||||
*
|
||||
|
||||
@@ -32,8 +32,6 @@ struct ipv6_miniroute {
|
||||
|
||||
/* Network device */
|
||||
struct net_device *netdev;
|
||||
/** Reference to network device */
|
||||
struct reference netdev_ref;
|
||||
|
||||
/* Destination prefix */
|
||||
struct in6_addr prefix;
|
||||
@@ -48,8 +46,6 @@ struct ipv6_miniroute {
|
||||
/** List of IPv6 miniroutes */
|
||||
static LIST_HEAD ( miniroutes );
|
||||
|
||||
static void ipv6_forget_netdev ( struct reference *ref );
|
||||
|
||||
/**
|
||||
* Add IPv6 minirouting table entry
|
||||
*
|
||||
@@ -69,7 +65,7 @@ static struct ipv6_miniroute * add_ipv6_miniroute ( struct net_device *netdev,
|
||||
miniroute = malloc ( sizeof ( *miniroute ) );
|
||||
if ( miniroute ) {
|
||||
/* Record routing information */
|
||||
miniroute->netdev = netdev;
|
||||
miniroute->netdev = netdev_get ( netdev );
|
||||
miniroute->prefix = prefix;
|
||||
miniroute->prefix_len = prefix_len;
|
||||
miniroute->address = address;
|
||||
@@ -81,10 +77,6 @@ static struct ipv6_miniroute * add_ipv6_miniroute ( struct net_device *netdev,
|
||||
} else {
|
||||
list_add ( &miniroute->list, &miniroutes );
|
||||
}
|
||||
|
||||
/* Record reference to net_device */
|
||||
miniroute->netdev_ref.forget = ipv6_forget_netdev;
|
||||
ref_add ( &miniroute->netdev_ref, &netdev->references );
|
||||
}
|
||||
|
||||
return miniroute;
|
||||
@@ -96,23 +88,11 @@ static struct ipv6_miniroute * add_ipv6_miniroute ( struct net_device *netdev,
|
||||
* @v miniroute Routing table entry
|
||||
*/
|
||||
static void del_ipv6_miniroute ( struct ipv6_miniroute *miniroute ) {
|
||||
ref_del ( &miniroute->netdev_ref );
|
||||
netdev_put ( miniroute->netdev );
|
||||
list_del ( &miniroute->list );
|
||||
free ( miniroute );
|
||||
}
|
||||
|
||||
/**
|
||||
* Forget reference to net_device
|
||||
*
|
||||
* @v ref Persistent reference
|
||||
*/
|
||||
static void ipv6_forget_netdev ( struct reference *ref ) {
|
||||
struct ipv6_miniroute *miniroute
|
||||
= container_of ( ref, struct ipv6_miniroute, netdev_ref );
|
||||
|
||||
del_ipv6_miniroute ( miniroute );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add IPv6 interface
|
||||
*
|
||||
|
||||
@@ -115,6 +115,19 @@ void netdev_tx_complete_next ( struct net_device *netdev ) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush device's transmit queue
|
||||
*
|
||||
* @v netdev Network device
|
||||
*/
|
||||
static void netdev_tx_flush ( struct net_device *netdev ) {
|
||||
|
||||
/* Discard any packets in the TX queue */
|
||||
while ( ! list_empty ( &netdev->tx_queue ) ) {
|
||||
netdev_tx_complete_next ( netdev );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add packet to receive queue
|
||||
*
|
||||
@@ -168,6 +181,36 @@ struct io_buffer * netdev_rx_dequeue ( struct net_device *netdev ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush device's receive queue
|
||||
*
|
||||
* @v netdev Network device
|
||||
*/
|
||||
static void netdev_rx_flush ( struct net_device *netdev ) {
|
||||
struct io_buffer *iobuf;
|
||||
|
||||
/* Discard any packets in the RX queue */
|
||||
while ( ( iobuf = netdev_rx_dequeue ( netdev ) ) ) {
|
||||
DBGC ( netdev, "NETDEV %p discarding received %p\n",
|
||||
netdev, iobuf );
|
||||
free_iob ( iobuf );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Free network device
|
||||
*
|
||||
* @v refcnt Network device reference counter
|
||||
*/
|
||||
static void free_netdev ( struct refcnt *refcnt ) {
|
||||
struct net_device *netdev =
|
||||
container_of ( refcnt, struct net_device, refcnt );
|
||||
|
||||
netdev_tx_flush ( netdev );
|
||||
netdev_rx_flush ( netdev );
|
||||
free ( netdev );
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate network device
|
||||
*
|
||||
@@ -184,7 +227,7 @@ struct net_device * alloc_netdev ( size_t priv_size ) {
|
||||
netdev = malloc ( total_len );
|
||||
if ( netdev ) {
|
||||
memset ( netdev, 0, total_len );
|
||||
INIT_LIST_HEAD ( &netdev->references );
|
||||
netdev->refcnt.free = free_netdev;
|
||||
INIT_LIST_HEAD ( &netdev->tx_queue );
|
||||
INIT_LIST_HEAD ( &netdev->rx_queue );
|
||||
netdev->priv = ( ( ( void * ) netdev ) + sizeof ( *netdev ) );
|
||||
@@ -209,6 +252,7 @@ int register_netdev ( struct net_device *netdev ) {
|
||||
ifindex++ );
|
||||
|
||||
/* Add to device list */
|
||||
netdev_get ( netdev );
|
||||
list_add_tail ( &netdev->list, &net_devices );
|
||||
DBGC ( netdev, "NETDEV %p registered as %s (phys %s hwaddr %s)\n",
|
||||
netdev, netdev->name, netdev->dev->name,
|
||||
@@ -247,7 +291,6 @@ int netdev_open ( struct net_device *netdev ) {
|
||||
* @v netdev Network device
|
||||
*/
|
||||
void netdev_close ( struct net_device *netdev ) {
|
||||
struct io_buffer *iobuf;
|
||||
|
||||
/* Do nothing if device is already closed */
|
||||
if ( ! ( netdev->state & NETDEV_OPEN ) )
|
||||
@@ -258,17 +301,9 @@ void netdev_close ( struct net_device *netdev ) {
|
||||
/* Close the device */
|
||||
netdev->close ( netdev );
|
||||
|
||||
/* Discard any packets in the TX queue */
|
||||
while ( ! list_empty ( &netdev->tx_queue ) ) {
|
||||
netdev_tx_complete_next ( netdev );
|
||||
}
|
||||
|
||||
/* Discard any packets in the RX queue */
|
||||
while ( ( iobuf = netdev_rx_dequeue ( netdev ) ) ) {
|
||||
DBGC ( netdev, "NETDEV %p discarding received %p\n",
|
||||
netdev, iobuf );
|
||||
free_iob ( iobuf );
|
||||
}
|
||||
/* Flush TX and RX queues */
|
||||
netdev_tx_flush ( netdev );
|
||||
netdev_rx_flush ( netdev );
|
||||
|
||||
/* Mark as closed */
|
||||
netdev->state &= ~NETDEV_OPEN;
|
||||
@@ -286,23 +321,12 @@ void unregister_netdev ( struct net_device *netdev ) {
|
||||
/* Ensure device is closed */
|
||||
netdev_close ( netdev );
|
||||
|
||||
/* Kill off any persistent references to this device */
|
||||
forget_references ( &netdev->references );
|
||||
|
||||
/* Remove from device list */
|
||||
list_del ( &netdev->list );
|
||||
netdev_put ( netdev );
|
||||
DBGC ( netdev, "NETDEV %p unregistered\n", netdev );
|
||||
}
|
||||
|
||||
/**
|
||||
* Free network device
|
||||
*
|
||||
* @v netdev Network device
|
||||
*/
|
||||
void free_netdev ( struct net_device *netdev ) {
|
||||
free ( netdev );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get network device by name
|
||||
*
|
||||
|
||||
@@ -140,7 +140,7 @@ static int udp_open_common ( struct xfer_interface *xfer,
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int udp_open ( struct xfer_interface *xfer, struct sockaddr *peer,
|
||||
struct sockaddr *local ) {
|
||||
struct sockaddr *local ) {
|
||||
return udp_open_common ( xfer, peer, local, 0 );
|
||||
}
|
||||
|
||||
|
||||
@@ -493,6 +493,8 @@ udp_to_dhcp ( struct udp_connection *conn ) {
|
||||
return container_of ( conn, struct dhcp_session, udp );
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
/**
|
||||
* Mark DHCP session as complete
|
||||
*
|
||||
@@ -515,9 +517,6 @@ static void dhcp_done ( struct dhcp_session *dhcp, int rc ) {
|
||||
/* Close UDP connection */
|
||||
udp_close ( &dhcp->udp );
|
||||
|
||||
/* Release reference on net device */
|
||||
ref_del ( &dhcp->netdev_ref );
|
||||
|
||||
/* Mark async operation as complete */
|
||||
async_done ( &dhcp->async, rc );
|
||||
}
|
||||
@@ -705,19 +704,6 @@ static struct udp_operations dhcp_udp_operations = {
|
||||
.newdata = dhcp_newdata,
|
||||
};
|
||||
|
||||
/**
|
||||
* Forget reference to net_device
|
||||
*
|
||||
* @v ref Persistent reference
|
||||
*/
|
||||
static void dhcp_forget_netdev ( struct reference *ref ) {
|
||||
struct dhcp_session *dhcp
|
||||
= container_of ( ref, struct dhcp_session, netdev_ref );
|
||||
|
||||
/* Kill DHCP session immediately */
|
||||
dhcp_done ( dhcp, -ENETUNREACH );
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiate DHCP on a network interface
|
||||
*
|
||||
@@ -742,13 +728,12 @@ int start_dhcp ( struct dhcp_session *dhcp, struct async *parent ) {
|
||||
if ( ( rc = udp_open ( &dhcp->udp, htons ( BOOTPC_PORT ) ) ) != 0 )
|
||||
return rc;
|
||||
|
||||
/* Add persistent reference to net device */
|
||||
dhcp->netdev_ref.forget = dhcp_forget_netdev;
|
||||
ref_add ( &dhcp->netdev_ref, &dhcp->netdev->references );
|
||||
|
||||
/* Proof of concept: just send a single DHCPDISCOVER */
|
||||
dhcp_send_request ( dhcp );
|
||||
|
||||
async_init ( &dhcp->async, &default_async_operations, parent );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user