Skip to content

Commit f2c4623

Browse files
committed
[netdevice] Allocate private data for each network upper-layer driver
Allow network upper-layer drivers (such as LLDP, which attaches to each network device in order to provide a corresponding LLDP settings block) to specify a size for private data, which will be allocated as part of the network device structure (as with the existing private data allocated for the underlying device driver). This will allow network upper-layer drivers to be simplified by omitting memory allocation and freeing code. If the upper-layer driver requires a reference counter (e.g. for interface initialisation), then it may use the network device's existing reference counter, since this is now the reference counter for the containing block of memory. Signed-off-by: Michael Brown <[email protected]>
1 parent eeb7cd5 commit f2c4623

File tree

13 files changed

+109
-34
lines changed

13 files changed

+109
-34
lines changed

src/arch/x86/interface/pxe/pxe_call.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -375,9 +375,10 @@ int pxe_start_nbp ( void ) {
375375
* Notify BIOS of existence of network device
376376
*
377377
* @v netdev Network device
378+
* @v priv Private data
378379
* @ret rc Return status code
379380
*/
380-
static int pxe_notify ( struct net_device *netdev ) {
381+
static int pxe_notify ( struct net_device *netdev, void *priv __unused ) {
381382

382383
/* Do nothing if we already have a network device */
383384
if ( pxe_netdev )

src/arch/x86/interface/vmware/guestinfo.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,11 @@ struct init_fn guestinfo_init_fn __init_fn ( INIT_NORMAL ) = {
207207
* Create per-netdevice GuestInfo settings
208208
*
209209
* @v netdev Network device
210+
* @v priv Private data
210211
* @ret rc Return status code
211212
*/
212-
static int guestinfo_net_probe ( struct net_device *netdev ) {
213+
static int guestinfo_net_probe ( struct net_device *netdev,
214+
void *priv __unused ) {
213215
struct settings *settings;
214216
int rc;
215217

@@ -247,8 +249,10 @@ static int guestinfo_net_probe ( struct net_device *netdev ) {
247249
* Remove per-netdevice GuestInfo settings
248250
*
249251
* @v netdev Network device
252+
* @v priv Private data
250253
*/
251-
static void guestinfo_net_remove ( struct net_device *netdev ) {
254+
static void guestinfo_net_remove ( struct net_device *netdev,
255+
void *priv __unused ) {
252256
struct settings *parent = netdev_settings ( netdev );
253257
struct settings *settings;
254258

src/core/cachedhcp.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,10 @@ struct startup_fn cachedhcp_startup_fn __startup_fn ( STARTUP_LATE ) = {
295295
* Apply cached DHCPACK to network device, if applicable
296296
*
297297
* @v netdev Network device
298+
* @v priv Private data
298299
* @ret rc Return status code
299300
*/
300-
static int cachedhcp_probe ( struct net_device *netdev ) {
301+
static int cachedhcp_probe ( struct net_device *netdev, void *priv __unused ) {
301302

302303
/* Apply cached DHCPACK to network device, if applicable */
303304
return cachedhcp_apply ( &cached_dhcpack, netdev );

src/drivers/net/netfront.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -1056,9 +1056,11 @@ struct xen_driver netfront_driver __xen_driver = {
10561056
* Inhibit emulated PCI devices
10571057
*
10581058
* @v netdev Network device
1059+
* @v priv Private data
10591060
* @ret rc Return status code
10601061
*/
1061-
static int netfront_net_probe ( struct net_device *netdev ) {
1062+
static int netfront_net_probe ( struct net_device *netdev,
1063+
void *priv __unused ) {
10621064
struct netfront_nic *netfront;
10631065

10641066
/* Inhibit emulated PCI devices matching an existing netfront device */

src/include/ipxe/netdevice.h

+8-3
Original file line numberDiff line numberDiff line change
@@ -473,22 +473,27 @@ struct net_device {
473473
struct net_driver {
474474
/** Name */
475475
const char *name;
476+
/** Size of private data */
477+
size_t priv_len;
476478
/** Probe device
477479
*
478480
* @v netdev Network device
481+
* @v priv Private data
479482
* @ret rc Return status code
480483
*/
481-
int ( * probe ) ( struct net_device *netdev );
484+
int ( * probe ) ( struct net_device *netdev, void *priv );
482485
/** Notify of device or link state change
483486
*
484487
* @v netdev Network device
488+
* @v priv Private data
485489
*/
486-
void ( * notify ) ( struct net_device *netdev );
490+
void ( * notify ) ( struct net_device *netdev, void *priv );
487491
/** Remove device
488492
*
489493
* @v netdev Network device
494+
* @v priv Private data
490495
*/
491-
void ( * remove ) ( struct net_device *netdev );
496+
void ( * remove ) ( struct net_device *netdev, void *priv );
492497
};
493498

494499
/** Network driver table */

src/interface/efi/efi_snp.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -1777,9 +1777,10 @@ static struct efi_snp_device * efi_snp_demux ( struct net_device *netdev ) {
17771777
* Create SNP device
17781778
*
17791779
* @v netdev Network device
1780+
* @v priv Private data
17801781
* @ret rc Return status code
17811782
*/
1782-
static int efi_snp_probe ( struct net_device *netdev ) {
1783+
static int efi_snp_probe ( struct net_device *netdev, void *priv __unused ) {
17831784
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
17841785
struct efi_device *efidev;
17851786
struct efi_snp_device *snpdev;
@@ -2017,8 +2018,9 @@ static int efi_snp_probe ( struct net_device *netdev ) {
20172018
* Handle SNP device or link state change
20182019
*
20192020
* @v netdev Network device
2021+
* @v priv Private data
20202022
*/
2021-
static void efi_snp_notify ( struct net_device *netdev ) {
2023+
static void efi_snp_notify ( struct net_device *netdev, void *priv __unused ) {
20222024
struct efi_snp_device *snpdev;
20232025

20242026
/* Locate SNP device */
@@ -2042,8 +2044,9 @@ static void efi_snp_notify ( struct net_device *netdev ) {
20422044
* Destroy SNP device
20432045
*
20442046
* @v netdev Network device
2047+
* @v priv Private data
20452048
*/
2046-
static void efi_snp_remove ( struct net_device *netdev ) {
2049+
static void efi_snp_remove ( struct net_device *netdev, void *priv __unused ) {
20472050
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
20482051
struct efi_snp_device *snpdev;
20492052
int leak = efi_shutdown_in_progress;

src/net/fcoe.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -1110,9 +1110,10 @@ static void fcoe_expired ( struct retry_timer *timer, int over __unused ) {
11101110
* Create FCoE port
11111111
*
11121112
* @v netdev Network device
1113+
* @v priv Private data
11131114
* @ret rc Return status code
11141115
*/
1115-
static int fcoe_probe ( struct net_device *netdev ) {
1116+
static int fcoe_probe ( struct net_device *netdev, void *priv __unused ) {
11161117
struct ll_protocol *ll_protocol = netdev->ll_protocol;
11171118
struct fcoe_port *fcoe;
11181119
int rc;
@@ -1162,8 +1163,9 @@ static int fcoe_probe ( struct net_device *netdev ) {
11621163
* Handle FCoE port device or link state change
11631164
*
11641165
* @v netdev Network device
1166+
* @v priv Private data
11651167
*/
1166-
static void fcoe_notify ( struct net_device *netdev ) {
1168+
static void fcoe_notify ( struct net_device *netdev, void *priv __unused ) {
11671169
struct fcoe_port *fcoe;
11681170

11691171
/* Sanity check */
@@ -1185,8 +1187,9 @@ static void fcoe_notify ( struct net_device *netdev ) {
11851187
* Destroy FCoE port
11861188
*
11871189
* @v netdev Network device
1190+
* @v priv Private data
11881191
*/
1189-
static void fcoe_remove ( struct net_device *netdev ) {
1192+
static void fcoe_remove ( struct net_device *netdev, void *priv __unused ) {
11901193
struct fcoe_port *fcoe;
11911194

11921195
/* Sanity check */

src/net/infiniband/xsigo.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -1829,8 +1829,10 @@ struct ib_driver xsigo_ib_driver __ib_driver = {
18291829
* Handle device or link status change
18301830
*
18311831
* @v netdev Network device
1832+
* @v priv Private data
18321833
*/
1833-
static void xsigo_net_notify ( struct net_device *netdev ) {
1834+
static void xsigo_net_notify ( struct net_device *netdev,
1835+
void *priv __unused ) {
18341836
struct xsigo_device *xdev;
18351837
struct ib_device *ibdev;
18361838
struct xsigo_manager *xcm;

src/net/ipv6.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -1224,9 +1224,11 @@ struct ipv6_settings {
12241224
* Register IPv6 link-local address settings
12251225
*
12261226
* @v netdev Network device
1227+
* @v priv Private data
12271228
* @ret rc Return status code
12281229
*/
1229-
static int ipv6_register_settings ( struct net_device *netdev ) {
1230+
static int ipv6_register_settings ( struct net_device *netdev,
1231+
void *priv __unused ) {
12301232
struct settings *parent = netdev_settings ( netdev );
12311233
struct ipv6_settings *ipv6set;
12321234
int rc;

src/net/lldp.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -296,9 +296,10 @@ struct net_protocol lldp_protocol __net_protocol = {
296296
* Create LLDP settings block
297297
*
298298
* @v netdev Network device
299+
* @v priv Private data
299300
* @ret rc Return status code
300301
*/
301-
static int lldp_probe ( struct net_device *netdev ) {
302+
static int lldp_probe ( struct net_device *netdev, void *priv __unused ) {
302303
struct lldp_settings *lldpset;
303304
int rc;
304305

src/net/neighbour.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -383,8 +383,9 @@ int neighbour_define ( struct net_device *netdev,
383383
* Update neighbour cache on network device state change or removal
384384
*
385385
* @v netdev Network device
386+
* @v priv Private data
386387
*/
387-
static void neighbour_flush ( struct net_device *netdev ) {
388+
static void neighbour_flush ( struct net_device *netdev, void *priv __unused ) {
388389
struct neighbour *neighbour;
389390
struct neighbour *tmp;
390391

src/net/netdevice.c

+60-13
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,65 @@ static int netdev_has_ll_addr ( struct net_device *netdev ) {
109109
return 0;
110110
}
111111

112+
/**
113+
* Get offset of network device driver private data
114+
*
115+
* @v driver Upper-layer driver, or NULL for device driver
116+
* @ret offset Offset of driver private data
117+
*/
118+
static size_t netdev_priv_offset ( struct net_driver *driver ) {
119+
struct net_device *netdev;
120+
unsigned int num_configs;
121+
size_t offset;
122+
123+
/* Allow space for network device */
124+
offset = sizeof ( *netdev );
125+
126+
/* Allow space for configurations */
127+
num_configs = table_num_entries ( NET_DEVICE_CONFIGURATORS );
128+
offset += ( num_configs * sizeof ( netdev->configs[0] ) );
129+
130+
/* Place variable-length device driver private data at end */
131+
if ( ! driver )
132+
driver = table_end ( NET_DRIVERS );
133+
134+
/* Allow space for preceding upper-layer drivers' private data */
135+
for_each_table_entry_continue_reverse ( driver, NET_DRIVERS ) {
136+
offset += driver->priv_len;
137+
}
138+
139+
/* Sanity check */
140+
assert ( ( offset & ( sizeof ( void * ) - 1 ) ) == 0 );
141+
142+
return offset;
143+
}
144+
145+
/**
146+
* Get network device driver private data
147+
*
148+
* @v netdev Network device
149+
* @v driver Upper-layer driver, or NULL for device driver
150+
* @ret priv Driver private data
151+
*/
152+
static void * netdev_priv ( struct net_device *netdev,
153+
struct net_driver *driver ) {
154+
155+
return ( ( ( void * ) netdev ) + netdev_priv_offset ( driver ) );
156+
}
157+
112158
/**
113159
* Notify drivers of network device or link state change
114160
*
115161
* @v netdev Network device
116162
*/
117163
static void netdev_notify ( struct net_device *netdev ) {
118164
struct net_driver *driver;
165+
void *priv;
119166

120167
for_each_table_entry ( driver, NET_DRIVERS ) {
168+
priv = netdev_priv ( netdev, driver );
121169
if ( driver->notify )
122-
driver->notify ( netdev );
170+
driver->notify ( netdev, priv );
123171
}
124172
}
125173

@@ -675,14 +723,8 @@ struct net_device * alloc_netdev ( size_t priv_len ) {
675723
struct net_device *netdev;
676724
struct net_device_configurator *configurator;
677725
struct net_device_configuration *config;
678-
unsigned int num_configs;
679-
size_t confs_len;
680-
size_t total_len;
681726

682-
num_configs = table_num_entries ( NET_DEVICE_CONFIGURATORS );
683-
confs_len = ( num_configs * sizeof ( netdev->configs[0] ) );
684-
total_len = ( sizeof ( *netdev ) + confs_len + priv_len );
685-
netdev = zalloc ( total_len );
727+
netdev = zalloc ( netdev_priv_offset ( NULL ) + priv_len );
686728
if ( netdev ) {
687729
ref_init ( &netdev->refcnt, free_netdev );
688730
netdev->link_rc = -EUNKNOWN_LINK_STATUS;
@@ -701,8 +743,7 @@ struct net_device * alloc_netdev ( size_t priv_len ) {
701743
&netdev->refcnt );
702744
config++;
703745
}
704-
netdev->priv = ( ( ( void * ) netdev ) + sizeof ( *netdev ) +
705-
confs_len );
746+
netdev->priv = netdev_priv ( netdev, NULL );
706747
}
707748
return netdev;
708749
}
@@ -722,6 +763,7 @@ int register_netdev ( struct net_device *netdev ) {
722763
struct net_device *duplicate;
723764
unsigned int i;
724765
uint32_t seed;
766+
void *priv;
725767
int rc;
726768

727769
/* Set initial link-layer address, if not already set */
@@ -784,7 +826,9 @@ int register_netdev ( struct net_device *netdev ) {
784826

785827
/* Probe device */
786828
for_each_table_entry ( driver, NET_DRIVERS ) {
787-
if ( driver->probe && ( rc = driver->probe ( netdev ) ) != 0 ) {
829+
priv = netdev_priv ( netdev, driver );
830+
if ( driver->probe &&
831+
( rc = driver->probe ( netdev, priv ) ) != 0 ) {
788832
DBGC ( netdev, "NETDEV %s could not add %s device: "
789833
"%s\n", netdev->name, driver->name,
790834
strerror ( rc ) );
@@ -796,8 +840,9 @@ int register_netdev ( struct net_device *netdev ) {
796840

797841
err_probe:
798842
for_each_table_entry_continue_reverse ( driver, NET_DRIVERS ) {
843+
priv = netdev_priv ( netdev, driver );
799844
if ( driver->remove )
800-
driver->remove ( netdev );
845+
driver->remove ( netdev, priv );
801846
}
802847
clear_settings ( netdev_settings ( netdev ) );
803848
unregister_settings ( netdev_settings ( netdev ) );
@@ -896,14 +941,16 @@ void netdev_close ( struct net_device *netdev ) {
896941
*/
897942
void unregister_netdev ( struct net_device *netdev ) {
898943
struct net_driver *driver;
944+
void *priv;
899945

900946
/* Ensure device is closed */
901947
netdev_close ( netdev );
902948

903949
/* Remove device */
904950
for_each_table_entry_reverse ( driver, NET_DRIVERS ) {
951+
priv = netdev_priv ( netdev, driver );
905952
if ( driver->remove )
906-
driver->remove ( netdev );
953+
driver->remove ( netdev, priv );
907954
}
908955

909956
/* Unregister per-netdev configuration settings */

src/net/vlan.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -470,9 +470,10 @@ void vlan_auto ( const void *ll_addr, unsigned int tag ) {
470470
* Create automatic VLAN device
471471
*
472472
* @v trunk Trunk network device
473+
* @v priv Private data
473474
* @ret rc Return status code
474475
*/
475-
static int vlan_probe ( struct net_device *trunk ) {
476+
static int vlan_probe ( struct net_device *trunk, void *priv __unused ) {
476477
int rc;
477478

478479
/* Do nothing unless an automatic VLAN exists */
@@ -498,8 +499,9 @@ static int vlan_probe ( struct net_device *trunk ) {
498499
* Handle trunk network device link state change
499500
*
500501
* @v trunk Trunk network device
502+
* @v priv Private data
501503
*/
502-
static void vlan_notify ( struct net_device *trunk ) {
504+
static void vlan_notify ( struct net_device *trunk, void *priv __unused ) {
503505
struct net_device *netdev;
504506
struct vlan_device *vlan;
505507

@@ -538,8 +540,9 @@ static int vlan_remove_first ( struct net_device *trunk ) {
538540
* Destroy all VLAN devices for a given trunk
539541
*
540542
* @v trunk Trunk network device
543+
* @v priv Private data
541544
*/
542-
static void vlan_remove ( struct net_device *trunk ) {
545+
static void vlan_remove ( struct net_device *trunk, void *priv __unused ) {
543546

544547
/* Remove all VLAN devices attached to this trunk, safe
545548
* against arbitrary net device removal.

0 commit comments

Comments
 (0)