1919#include <sys/ioctl.h>
2020#endif
2121
22+ #if RV32EMU_NET_HAS_TAP || RV32EMU_NET_HAS_SLIRP
23+ typedef int (* netdev_init_fn_t )(netdev_t * netdev );
24+ #endif
25+
2226static void netdev_reset (netdev_t * netdev )
2327{
2428 if (!netdev )
2529 return ;
2630
2731 netdev -> name = NULL ;
28- netdev -> type = NETDEV_IMPL_none ;
32+ netdev -> type = NETDEV_IMPL_NONE ;
2933 netdev -> op = NULL ;
3034}
3135
36+ #if RV32EMU_NET_HAS_TAP || RV32EMU_NET_HAS_SLIRP
37+ static bool netdev_setup (netdev_t * netdev ,
38+ const char * name ,
39+ netdev_impl_t type ,
40+ size_t options_size ,
41+ netdev_init_fn_t init_fn )
42+ {
43+ netdev -> name = name ;
44+ netdev -> type = type ;
45+ netdev -> op = calloc (1 , options_size );
46+
47+ if (!netdev -> op ) {
48+ netdev_reset (netdev );
49+ return false;
50+ }
51+
52+ if (init_fn (netdev ) < 0 ) {
53+ free (netdev -> op );
54+ netdev_reset (netdev );
55+ return false;
56+ }
57+
58+ return true;
59+ }
60+ #endif
61+
3262#if RV32EMU_NET_HAS_TAP
3363static int net_init_tap (netdev_t * netdev )
3464{
3565 net_tap_options_t * tap = (net_tap_options_t * ) netdev -> op ;
3666
67+ tap -> tap_fd = -1 ;
3768 tap -> tap_fd = open ("/dev/net/tun" , O_RDWR );
3869 if (tap -> tap_fd < 0 ) {
3970 rv_log_error ("failed to open TAP device: %s" , strerror (errno ));
@@ -84,19 +115,16 @@ static int net_init_user(netdev_t *netdev)
84115}
85116#endif
86117
87- #if RV32EMU_NET_HAS_TAP
88- static const char * netdev_linux_default (void )
118+ static const char * netdev_default_backend (void )
89119{
120+ #if RV32EMU_NET_HAS_TAP
90121 return "tap" ;
91- }
92- #endif
93-
94- #if defined(__APPLE__ ) && RV32EMU_NET_HAS_SLIRP
95- static const char * netdev_macos_default (void )
96- {
122+ #elif RV32EMU_NET_HAS_SLIRP
97123 return "user" ;
98- }
124+ #else
125+ return NULL ;
99126#endif
127+ }
100128
101129bool netdev_init (netdev_t * netdev , const char * net_type )
102130{
@@ -105,73 +133,28 @@ bool netdev_init(netdev_t *netdev, const char *net_type)
105133
106134 netdev_reset (netdev );
107135
108- #if defined(__APPLE__ ) && RV32EMU_NET_HAS_SLIRP
109- const char * requested = net_type ? net_type : netdev_macos_default ();
110-
111- if (!strcmp (requested , "user" )) {
112- netdev -> name = "user" ;
113- netdev -> type = NETDEV_IMPL_user ;
114- netdev -> op = calloc (1 , sizeof (net_user_options_t ));
115- if (!netdev -> op )
116- return false;
117-
118- if (net_init_user (netdev ) < 0 ) {
119- free (netdev -> op );
120- netdev -> op = NULL ;
121- return false;
122- }
123-
124- return true;
136+ const char * requested = net_type ? net_type : netdev_default_backend ();
137+ if (!requested ) {
138+ rv_log_error ("no virtio-net backend was compiled" );
139+ return false;
125140 }
126141
127- rv_log_error ("unsupported virtio-net backend on macOS: %s" , requested );
128- return false;
129-
130- #elif RV32EMU_NET_HAS_TAP
131- const char * requested = net_type ? net_type : netdev_linux_default ();
132-
142+ #if RV32EMU_NET_HAS_TAP
133143 if (!strcmp (requested , "tap" )) {
134- netdev -> name = "tap" ;
135- netdev -> type = NETDEV_IMPL_tap ;
136- netdev -> op = calloc (1 , sizeof (net_tap_options_t ));
137- if (!netdev -> op )
138- return false;
139-
140- if (net_init_tap (netdev ) < 0 ) {
141- free (netdev -> op );
142- netdev -> op = NULL ;
143- return false;
144- }
145-
146- return true;
144+ return netdev_setup (netdev , "tap" , NETDEV_IMPL_TAP ,
145+ sizeof (net_tap_options_t ), net_init_tap );
147146 }
147+ #endif
148148
149149#if RV32EMU_NET_HAS_SLIRP
150150 if (!strcmp (requested , "user" )) {
151- netdev -> name = "user" ;
152- netdev -> type = NETDEV_IMPL_user ;
153- netdev -> op = calloc (1 , sizeof (net_user_options_t ));
154- if (!netdev -> op )
155- return false;
156-
157- if (net_init_user (netdev ) < 0 ) {
158- free (netdev -> op );
159- netdev -> op = NULL ;
160- return false;
161- }
162-
163- return true;
151+ return netdev_setup (netdev , "user" , NETDEV_IMPL_USER ,
152+ sizeof (net_user_options_t ), net_init_user );
164153 }
165154#endif
166155
167- rv_log_error ("unsupported virtio-net backend on Linux : %s" , requested );
156+ rv_log_error ("unsupported virtio-net backend: %s" , requested );
168157 return false;
169-
170- #else
171- (void ) net_type ;
172- rv_log_error ("virtio-net networking is disabled on this host" );
173- return false;
174- #endif
175158}
176159
177160void netdev_delete (netdev_t * netdev )
@@ -181,7 +164,7 @@ void netdev_delete(netdev_t *netdev)
181164
182165 switch (netdev -> type ) {
183166#if RV32EMU_NET_HAS_TAP
184- case NETDEV_IMPL_tap : {
167+ case NETDEV_IMPL_TAP : {
185168 net_tap_options_t * tap = (net_tap_options_t * ) netdev -> op ;
186169 if (tap -> tap_fd >= 0 )
187170 close (tap -> tap_fd );
@@ -190,11 +173,12 @@ void netdev_delete(netdev_t *netdev)
190173#endif
191174
192175#if RV32EMU_NET_HAS_SLIRP
193- case NETDEV_IMPL_user :
176+ case NETDEV_IMPL_USER :
194177 net_slirp_cleanup ((net_user_options_t * ) netdev -> op );
195178 break ;
196179#endif
197180
181+ case NETDEV_IMPL_NONE :
198182 default :
199183 break ;
200184 }
0 commit comments