fidl_fuchsia_net_routes_ext/
admin.rs

1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5//! Extensions for fuchsia.net.routes.admin.
6
7use std::fmt::Debug;
8
9use fidl::endpoints::{DiscoverableProtocolMarker, ProtocolMarker, ServerEnd};
10use futures::future::Either;
11use futures::TryStream;
12use net_types::ip::{GenericOverIp, Ip, IpInvariant, Ipv4, Ipv6};
13use thiserror::Error;
14use {
15    fidl_fuchsia_net_interfaces_admin as fnet_interfaces_admin, fidl_fuchsia_net_root as fnet_root,
16    fidl_fuchsia_net_routes_admin as fnet_routes_admin,
17};
18
19use crate::{impl_responder, FidlRouteIpExt, Responder, TableId};
20
21/// Route set creation errors.
22#[derive(Clone, Debug, Error)]
23pub enum RouteSetCreationError {
24    /// Proxy creation failed.
25    #[error("failed to create proxy: {0}")]
26    CreateProxy(fidl::Error),
27    /// Route set creation failed.
28    #[error("failed to create route set: {0}")]
29    RouteSet(fidl::Error),
30}
31
32/// Route table creation errors.
33#[derive(Clone, Debug, Error)]
34pub enum RouteTableCreationError {
35    /// Proxy creation failed.
36    #[error("failed to create proxy: {0}")]
37    CreateProxy(fidl::Error),
38    /// Route table creation failed.
39    #[error("failed to create route set: {0}")]
40    RouteTable(fidl::Error),
41}
42
43/// Admin extension for the `fuchsia.net.routes.admin` FIDL API.
44pub trait FidlRouteAdminIpExt: Ip {
45    /// The "route table" protocol to use for this IP version.
46    type RouteTableMarker: DiscoverableProtocolMarker<
47        RequestStream = Self::RouteTableRequestStream,
48        Proxy: Clone,
49    >;
50    /// The "root set" protocol to use for this IP version.
51    type GlobalRouteTableMarker: DiscoverableProtocolMarker;
52    /// The "route set" protocol to use for this IP version.
53    type RouteSetMarker: ProtocolMarker<RequestStream = Self::RouteSetRequestStream>;
54    /// The "route table provider" protocol to use for this IP version.
55    type RouteTableProviderMarker: DiscoverableProtocolMarker<Proxy: Clone>;
56    /// The request stream for the route set protocol.
57    type RouteSetRequestStream: fidl::endpoints::RequestStream<Ok: Send, ControlHandle: Send>;
58    /// The request stream for the route table protocol.
59    type RouteTableRequestStream: fidl::endpoints::RequestStream<Ok: Send, ControlHandle: Send>;
60    /// The responder for AddRoute requests.
61    type AddRouteResponder: Responder<Payload = Result<bool, fnet_routes_admin::RouteSetError>>;
62    /// The responder for RemoveRoute requests.
63    type RemoveRouteResponder: Responder<Payload = Result<bool, fnet_routes_admin::RouteSetError>>;
64    /// The responder for AuthenticateForInterface requests.
65    type RouteSetAuthenticateForInterfaceResponder: Responder<
66        Payload = Result<(), fnet_routes_admin::AuthenticateForInterfaceError>,
67    >;
68    /// The responder for GetTableId requests.
69    type RouteTableGetTableIdResponder: Responder<Payload = u32>;
70    /// The responder for RemoveRequests.
71    type RouteTableRemoveResponder: Responder<
72        Payload = Result<(), fnet_routes_admin::BaseRouteTableRemoveError>,
73    >;
74    /// The responder for GetAuthorizationForRouteTable requests.
75    type RouteTableGetAuthorizationResponder: Responder<
76        Payload = fnet_routes_admin::GrantForRouteTableAuthorization,
77    >;
78    /// The control handle for RouteTable protocols.
79    type RouteTableControlHandle: fidl::endpoints::ControlHandle + Debug;
80
81    /// Turns a FIDL route set request into the extension type.
82    fn into_route_set_request(
83        request: fidl::endpoints::Request<Self::RouteSetMarker>,
84    ) -> RouteSetRequest<Self>;
85
86    /// Turns a FIDL route table request into the extension type.
87    fn into_route_table_request(
88        request: fidl::endpoints::Request<Self::RouteTableMarker>,
89    ) -> RouteTableRequest<Self>;
90
91    /// Turns a FIDL route set request stream item into a Result of the extension type.
92    fn into_route_set_request_result(
93        request: <Self::RouteSetRequestStream as futures::Stream>::Item,
94    ) -> Result<RouteSetRequest<Self>, fidl::Error>;
95
96    /// Turns a FIDL route table request stream item into a Result of the extension type.
97    fn into_route_table_request_result(
98        request: <Self::RouteTableRequestStream as futures::Stream>::Item,
99    ) -> Result<RouteTableRequest<Self>, fidl::Error>;
100}
101
102impl FidlRouteAdminIpExt for Ipv4 {
103    type RouteTableMarker = fnet_routes_admin::RouteTableV4Marker;
104    type GlobalRouteTableMarker = fnet_root::RoutesV4Marker;
105    type RouteSetMarker = fnet_routes_admin::RouteSetV4Marker;
106    type RouteTableProviderMarker = fnet_routes_admin::RouteTableProviderV4Marker;
107    type RouteSetRequestStream = fnet_routes_admin::RouteSetV4RequestStream;
108    type RouteTableRequestStream = fnet_routes_admin::RouteTableV4RequestStream;
109    type AddRouteResponder = fnet_routes_admin::RouteSetV4AddRouteResponder;
110    type RemoveRouteResponder = fnet_routes_admin::RouteSetV4RemoveRouteResponder;
111    type RouteSetAuthenticateForInterfaceResponder =
112        fnet_routes_admin::RouteSetV4AuthenticateForInterfaceResponder;
113    type RouteTableGetTableIdResponder = fnet_routes_admin::RouteTableV4GetTableIdResponder;
114    type RouteTableRemoveResponder = fnet_routes_admin::RouteTableV4RemoveResponder;
115    type RouteTableGetAuthorizationResponder =
116        fnet_routes_admin::RouteTableV4GetAuthorizationForRouteTableResponder;
117    type RouteTableControlHandle = fnet_routes_admin::RouteTableV4ControlHandle;
118
119    fn into_route_set_request(
120        request: fidl::endpoints::Request<Self::RouteSetMarker>,
121    ) -> RouteSetRequest<Self> {
122        RouteSetRequest::from(request)
123    }
124
125    fn into_route_table_request(
126        request: fidl::endpoints::Request<Self::RouteTableMarker>,
127    ) -> RouteTableRequest<Self> {
128        RouteTableRequest::from(request)
129    }
130
131    fn into_route_set_request_result(
132        request: <Self::RouteSetRequestStream as futures::Stream>::Item,
133    ) -> Result<RouteSetRequest<Self>, fidl::Error> {
134        request.map(RouteSetRequest::from)
135    }
136
137    fn into_route_table_request_result(
138        request: <Self::RouteTableRequestStream as futures::Stream>::Item,
139    ) -> Result<RouteTableRequest<Self>, fidl::Error> {
140        request.map(RouteTableRequest::from)
141    }
142}
143
144impl FidlRouteAdminIpExt for Ipv6 {
145    type RouteTableMarker = fnet_routes_admin::RouteTableV6Marker;
146    type GlobalRouteTableMarker = fnet_root::RoutesV6Marker;
147    type RouteSetMarker = fnet_routes_admin::RouteSetV6Marker;
148    type RouteTableProviderMarker = fnet_routes_admin::RouteTableProviderV6Marker;
149    type RouteSetRequestStream = fnet_routes_admin::RouteSetV6RequestStream;
150    type RouteTableRequestStream = fnet_routes_admin::RouteTableV6RequestStream;
151    type AddRouteResponder = fnet_routes_admin::RouteSetV6AddRouteResponder;
152    type RemoveRouteResponder = fnet_routes_admin::RouteSetV6RemoveRouteResponder;
153    type RouteSetAuthenticateForInterfaceResponder =
154        fnet_routes_admin::RouteSetV6AuthenticateForInterfaceResponder;
155    type RouteTableGetTableIdResponder = fnet_routes_admin::RouteTableV6GetTableIdResponder;
156    type RouteTableRemoveResponder = fnet_routes_admin::RouteTableV6RemoveResponder;
157    type RouteTableGetAuthorizationResponder =
158        fnet_routes_admin::RouteTableV6GetAuthorizationForRouteTableResponder;
159    type RouteTableControlHandle = fnet_routes_admin::RouteTableV6ControlHandle;
160
161    fn into_route_set_request(
162        request: fidl::endpoints::Request<Self::RouteSetMarker>,
163    ) -> RouteSetRequest<Self> {
164        RouteSetRequest::from(request)
165    }
166
167    fn into_route_table_request(
168        request: fidl::endpoints::Request<Self::RouteTableMarker>,
169    ) -> RouteTableRequest<Self> {
170        RouteTableRequest::from(request)
171    }
172
173    fn into_route_set_request_result(
174        request: <Self::RouteSetRequestStream as futures::Stream>::Item,
175    ) -> Result<RouteSetRequest<Self>, fidl::Error> {
176        request.map(RouteSetRequest::from)
177    }
178
179    fn into_route_table_request_result(
180        request: <Self::RouteTableRequestStream as futures::Stream>::Item,
181    ) -> Result<RouteTableRequest<Self>, fidl::Error> {
182        request.map(RouteTableRequest::from)
183    }
184}
185
186impl_responder!(
187    fnet_routes_admin::RouteSetV4AddRouteResponder,
188    Result<bool, fnet_routes_admin::RouteSetError>,
189);
190impl_responder!(
191    fnet_routes_admin::RouteSetV4RemoveRouteResponder,
192    Result<bool, fnet_routes_admin::RouteSetError>,
193);
194impl_responder!(
195    fnet_routes_admin::RouteSetV6AddRouteResponder,
196    Result<bool, fnet_routes_admin::RouteSetError>,
197);
198impl_responder!(
199    fnet_routes_admin::RouteSetV6RemoveRouteResponder,
200    Result<bool, fnet_routes_admin::RouteSetError>,
201);
202impl_responder!(
203    fnet_routes_admin::RouteSetV4AuthenticateForInterfaceResponder,
204    Result<(), fnet_routes_admin::AuthenticateForInterfaceError>,
205);
206impl_responder!(
207    fnet_routes_admin::RouteSetV6AuthenticateForInterfaceResponder,
208    Result<(), fnet_routes_admin::AuthenticateForInterfaceError>,
209);
210impl_responder!(fnet_routes_admin::RouteTableV4GetTableIdResponder, u32,);
211impl_responder!(fnet_routes_admin::RouteTableV6GetTableIdResponder, u32,);
212impl_responder!(
213    fnet_routes_admin::RouteTableV4RemoveResponder,
214    Result<(), fnet_routes_admin::BaseRouteTableRemoveError>,
215);
216impl_responder!(
217    fnet_routes_admin::RouteTableV6RemoveResponder,
218    Result<(), fnet_routes_admin::BaseRouteTableRemoveError>,
219);
220impl_responder!(
221    fnet_routes_admin::RouteTableV4GetAuthorizationForRouteTableResponder,
222    fnet_routes_admin::GrantForRouteTableAuthorization,
223);
224impl_responder!(
225    fnet_routes_admin::RouteTableV6GetAuthorizationForRouteTableResponder,
226    fnet_routes_admin::GrantForRouteTableAuthorization,
227);
228
229/// The compiler often fails to infer that an item in the RouteTableProvider request stream is a
230/// Result. This function helps force it to understand this so that the Result can be unwrapped
231/// to get the actual RouteTableProvider request inside.
232pub fn concretize_route_table_provider_request<I: Ip + FidlRouteAdminIpExt>(
233    item: <<<I as FidlRouteAdminIpExt>::RouteTableProviderMarker as ProtocolMarker>::RequestStream as futures::Stream>::Item,
234) -> Result<(ServerEnd<I::RouteTableMarker>, Option<String>), fidl::Error> {
235    #[derive(GenericOverIp)]
236    #[generic_over_ip(I, Ip)]
237    struct In<I: FidlRouteAdminIpExt>(<<<I as FidlRouteAdminIpExt>::RouteTableProviderMarker as ProtocolMarker>::RequestStream as futures::Stream>::Item);
238
239    #[derive(GenericOverIp)]
240    #[generic_over_ip(I, Ip)]
241    struct Out<I: FidlRouteAdminIpExt>(
242        Result<(ServerEnd<I::RouteTableMarker>, Option<String>), fidl::Error>,
243    );
244
245    let Out(result) = net_types::map_ip_twice!(I, In(item), |In(item)| Out(
246        item.map(unpack_route_table_provider_request::<I>)
247    ));
248    result
249}
250
251/// Unpacks the `[ServerEnd]` and debug name from a request for a new route table.
252pub fn unpack_route_table_provider_request<I: Ip + FidlRouteAdminIpExt>(
253    request: <<I::RouteTableProviderMarker as ProtocolMarker>::RequestStream as TryStream>::Ok,
254) -> (ServerEnd<I::RouteTableMarker>, Option<String>) {
255    #[derive(GenericOverIp)]
256    #[generic_over_ip(I, Ip)]
257    struct Request<I: FidlRouteAdminIpExt>(
258        <<I::RouteTableProviderMarker as ProtocolMarker>::RequestStream as TryStream>::Ok,
259    );
260
261    #[derive(GenericOverIp)]
262    #[generic_over_ip(I, Ip)]
263    struct Contents<I: FidlRouteAdminIpExt>((ServerEnd<I::RouteTableMarker>, Option<String>));
264
265    let Contents(contents) = I::map_ip(
266        Request(request),
267        |Request(request)| {
268            let fnet_routes_admin::RouteTableProviderV4Request::NewRouteTable {
269                provider,
270                options: fnet_routes_admin::RouteTableOptionsV4 { name, __source_breaking },
271                control_handle: _,
272            } = request;
273            Contents((provider, name))
274        },
275        |Request(request)| {
276            let fnet_routes_admin::RouteTableProviderV6Request::NewRouteTable {
277                provider,
278                options: fnet_routes_admin::RouteTableOptionsV6 { name, __source_breaking },
279                control_handle: _,
280            } = request;
281            Contents((provider, name))
282        },
283    );
284    contents
285}
286
287/// Dispatches `new_route_table` on either the `RouteTableProviderV4`
288/// or `RouteTableProviderV6` proxy.
289pub fn new_route_table<I: Ip + FidlRouteAdminIpExt>(
290    route_table_provider_proxy: &<I::RouteTableProviderMarker as ProtocolMarker>::Proxy,
291    name: Option<String>,
292) -> Result<<I::RouteTableMarker as ProtocolMarker>::Proxy, RouteTableCreationError> {
293    let (route_table_proxy, route_table_server_end) =
294        fidl::endpoints::create_proxy::<I::RouteTableMarker>();
295
296    #[derive(GenericOverIp)]
297    #[generic_over_ip(I, Ip)]
298    struct NewRouteTableInput<'a, I: FidlRouteAdminIpExt> {
299        route_table_server_end: fidl::endpoints::ServerEnd<I::RouteTableMarker>,
300        route_table_provider_proxy: &'a <I::RouteTableProviderMarker as ProtocolMarker>::Proxy,
301        name: Option<String>,
302    }
303
304    let result = I::map_ip_in(
305        NewRouteTableInput::<'_, I> { route_table_server_end, route_table_provider_proxy, name },
306        |NewRouteTableInput { route_table_server_end, route_table_provider_proxy, name }| {
307            route_table_provider_proxy.new_route_table(
308                route_table_server_end,
309                &fnet_routes_admin::RouteTableOptionsV4 {
310                    name,
311                    ..fnet_routes_admin::RouteTableOptionsV4::default()
312                },
313            )
314        },
315        |NewRouteTableInput { route_table_server_end, route_table_provider_proxy, name }| {
316            route_table_provider_proxy.new_route_table(
317                route_table_server_end,
318                &fnet_routes_admin::RouteTableOptionsV6 {
319                    name,
320                    ..fnet_routes_admin::RouteTableOptionsV6::default()
321                },
322            )
323        },
324    );
325
326    result.map_err(RouteTableCreationError::RouteTable)?;
327    Ok(route_table_proxy)
328}
329
330/// Dispatches `new_route_set` on either the `RouteTableV4`
331/// or `RouteTableV6` proxy.
332pub fn new_route_set<I: Ip + FidlRouteAdminIpExt>(
333    route_table_proxy: &<I::RouteTableMarker as ProtocolMarker>::Proxy,
334) -> Result<<I::RouteSetMarker as ProtocolMarker>::Proxy, RouteSetCreationError> {
335    let (route_set_proxy, route_set_server_end) =
336        fidl::endpoints::create_proxy::<I::RouteSetMarker>();
337
338    #[derive(GenericOverIp)]
339    #[generic_over_ip(I, Ip)]
340    struct NewRouteSetInput<'a, I: FidlRouteAdminIpExt> {
341        route_set_server_end: fidl::endpoints::ServerEnd<I::RouteSetMarker>,
342        route_table_proxy: &'a <I::RouteTableMarker as ProtocolMarker>::Proxy,
343    }
344    let result = I::map_ip_in(
345        NewRouteSetInput::<'_, I> { route_set_server_end, route_table_proxy },
346        |NewRouteSetInput { route_set_server_end, route_table_proxy }| {
347            route_table_proxy.new_route_set(route_set_server_end)
348        },
349        |NewRouteSetInput { route_set_server_end, route_table_proxy }| {
350            route_table_proxy.new_route_set(route_set_server_end)
351        },
352    );
353
354    result.map_err(RouteSetCreationError::RouteSet)?;
355    Ok(route_set_proxy)
356}
357
358/// Dispatches `global_route_set` on either the `RoutesV4` or `RoutesV6` in
359/// fuchsia.net.root.
360pub fn new_global_route_set<I: Ip + FidlRouteAdminIpExt>(
361    route_table_proxy: &<I::GlobalRouteTableMarker as ProtocolMarker>::Proxy,
362) -> Result<<I::RouteSetMarker as ProtocolMarker>::Proxy, RouteSetCreationError> {
363    let (route_set_proxy, route_set_server_end) =
364        fidl::endpoints::create_proxy::<I::RouteSetMarker>();
365
366    #[derive(GenericOverIp)]
367    #[generic_over_ip(I, Ip)]
368    struct NewRouteSetInput<'a, I: FidlRouteAdminIpExt> {
369        route_set_server_end: fidl::endpoints::ServerEnd<I::RouteSetMarker>,
370        route_table_proxy: &'a <I::GlobalRouteTableMarker as ProtocolMarker>::Proxy,
371    }
372    let result = I::map_ip_in(
373        NewRouteSetInput::<'_, I> { route_set_server_end, route_table_proxy },
374        |NewRouteSetInput { route_set_server_end, route_table_proxy }| {
375            route_table_proxy.global_route_set(route_set_server_end)
376        },
377        |NewRouteSetInput { route_set_server_end, route_table_proxy }| {
378            route_table_proxy.global_route_set(route_set_server_end)
379        },
380    );
381
382    result.map_err(RouteSetCreationError::RouteSet)?;
383    Ok(route_set_proxy)
384}
385
386/// Dispatches `add_route` on either the `RouteSetV4` or `RouteSetV6` proxy.
387pub async fn add_route<I: Ip + FidlRouteAdminIpExt + FidlRouteIpExt>(
388    route_set: &<I::RouteSetMarker as ProtocolMarker>::Proxy,
389    route: &I::Route,
390) -> Result<Result<bool, fnet_routes_admin::RouteSetError>, fidl::Error> {
391    #[derive(GenericOverIp)]
392    #[generic_over_ip(I, Ip)]
393    struct AddRouteInput<'a, I: FidlRouteAdminIpExt + FidlRouteIpExt> {
394        route_set: &'a <I::RouteSetMarker as ProtocolMarker>::Proxy,
395        route: &'a I::Route,
396    }
397
398    I::map_ip_in(
399        AddRouteInput { route_set, route },
400        |AddRouteInput { route_set, route }| Either::Left(route_set.add_route(route)),
401        |AddRouteInput { route_set, route }| Either::Right(route_set.add_route(route)),
402    )
403    .await
404}
405
406/// Dispatches `remove_route` on either the `RouteSetV4` or `RouteSetV6` proxy.
407pub async fn remove_route<I: Ip + FidlRouteAdminIpExt + FidlRouteIpExt>(
408    route_set: &<I::RouteSetMarker as ProtocolMarker>::Proxy,
409    route: &I::Route,
410) -> Result<Result<bool, fnet_routes_admin::RouteSetError>, fidl::Error> {
411    #[derive(GenericOverIp)]
412    #[generic_over_ip(I, Ip)]
413    struct RemoveRouteInput<'a, I: FidlRouteAdminIpExt + FidlRouteIpExt> {
414        route_set: &'a <I::RouteSetMarker as ProtocolMarker>::Proxy,
415        route: &'a I::Route,
416    }
417
418    I::map_ip_in(
419        RemoveRouteInput { route_set, route },
420        |RemoveRouteInput { route_set, route }| Either::Left(route_set.remove_route(route)),
421        |RemoveRouteInput { route_set, route }| Either::Right(route_set.remove_route(route)),
422    )
423    .await
424}
425
426/// Dispatches `authenticate_for_interface` on either the `RouteSetV4` or
427/// `RouteSetV6` proxy.
428pub async fn authenticate_for_interface<I: Ip + FidlRouteAdminIpExt + FidlRouteIpExt>(
429    route_set: &<I::RouteSetMarker as ProtocolMarker>::Proxy,
430    credential: fnet_interfaces_admin::ProofOfInterfaceAuthorization,
431) -> Result<Result<(), fnet_routes_admin::AuthenticateForInterfaceError>, fidl::Error> {
432    #[derive(GenericOverIp)]
433    #[generic_over_ip(I, Ip)]
434    struct AuthenticateForInterfaceInput<'a, I: FidlRouteAdminIpExt + FidlRouteIpExt> {
435        route_set: &'a <I::RouteSetMarker as ProtocolMarker>::Proxy,
436        credential: fnet_interfaces_admin::ProofOfInterfaceAuthorization,
437    }
438
439    I::map_ip_in(
440        AuthenticateForInterfaceInput { route_set, credential },
441        |AuthenticateForInterfaceInput { route_set, credential }| {
442            Either::Left(route_set.authenticate_for_interface(credential))
443        },
444        |AuthenticateForInterfaceInput { route_set, credential }| {
445            Either::Right(route_set.authenticate_for_interface(credential))
446        },
447    )
448    .await
449}
450
451#[derive(GenericOverIp)]
452#[generic_over_ip(I, Ip)]
453struct RouteTableProxy<'a, I: FidlRouteAdminIpExt + FidlRouteIpExt> {
454    route_table: &'a <I::RouteTableMarker as ProtocolMarker>::Proxy,
455}
456
457/// Dispatches `detach` on either the `RouteTableV4` or `RouteTableV6` proxy.
458pub async fn detach_route_table<I: Ip + FidlRouteAdminIpExt + FidlRouteIpExt>(
459    route_table: &<I::RouteTableMarker as ProtocolMarker>::Proxy,
460) -> Result<(), fidl::Error> {
461    let IpInvariant(result) = net_types::map_ip_twice!(
462        I,
463        RouteTableProxy { route_table },
464        |RouteTableProxy { route_table }| { IpInvariant(route_table.detach()) }
465    );
466
467    result
468}
469
470/// Dispatches `remove` on either the `RouteTableV4` or `RouteTableV6` proxy.
471pub async fn remove_route_table<I: Ip + FidlRouteAdminIpExt + FidlRouteIpExt>(
472    route_table: &<I::RouteTableMarker as ProtocolMarker>::Proxy,
473) -> Result<Result<(), fnet_routes_admin::BaseRouteTableRemoveError>, fidl::Error> {
474    let IpInvariant(result_fut) = net_types::map_ip_twice!(
475        I,
476        RouteTableProxy { route_table },
477        |RouteTableProxy { route_table }| { IpInvariant(route_table.remove()) }
478    );
479
480    result_fut.await
481}
482
483/// Dispatches `get_table_id` on either the `RouteTableV4` or `RouteTableV6`
484/// proxy.
485pub async fn get_table_id<I: Ip + FidlRouteAdminIpExt + FidlRouteIpExt>(
486    route_table: &<I::RouteTableMarker as ProtocolMarker>::Proxy,
487) -> Result<TableId, fidl::Error> {
488    let IpInvariant(result_fut) = net_types::map_ip_twice!(
489        I,
490        RouteTableProxy { route_table },
491        |RouteTableProxy { route_table }| IpInvariant(route_table.get_table_id()),
492    );
493
494    result_fut.await.map(TableId::new)
495}
496
497/// Dispatches `get_authorization_for_route_table` on either the `RouteTableV4`
498/// or `RouteTableV6` proxy.
499pub async fn get_authorization_for_route_table<I: Ip + FidlRouteAdminIpExt + FidlRouteIpExt>(
500    route_table: &<I::RouteTableMarker as ProtocolMarker>::Proxy,
501) -> Result<fnet_routes_admin::GrantForRouteTableAuthorization, fidl::Error> {
502    let IpInvariant(result_fut) = net_types::map_ip_twice!(
503        I,
504        RouteTableProxy { route_table },
505        |RouteTableProxy { route_table }| IpInvariant(
506            route_table.get_authorization_for_route_table()
507        ),
508    );
509
510    result_fut.await
511}
512
513/// GenericOverIp version of RouteSetV{4, 6}Request.
514#[derive(GenericOverIp, Debug)]
515#[generic_over_ip(I, Ip)]
516pub enum RouteSetRequest<I: FidlRouteAdminIpExt> {
517    /// Adds a route to the route set.
518    AddRoute {
519        /// The route to add.
520        route: Result<
521            crate::Route<I>,
522            crate::FidlConversionError<crate::RoutePropertiesRequiredFields>,
523        >,
524        /// The responder for this request.
525        responder: I::AddRouteResponder,
526    },
527    /// Removes a route from the route set.
528    RemoveRoute {
529        /// The route to add.
530        route: Result<
531            crate::Route<I>,
532            crate::FidlConversionError<crate::RoutePropertiesRequiredFields>,
533        >,
534        /// The responder for this request.
535        responder: I::RemoveRouteResponder,
536    },
537    /// Authenticates the route set for managing routes on an interface.
538    AuthenticateForInterface {
539        /// The credential proving authorization for this interface.
540        credential: fnet_interfaces_admin::ProofOfInterfaceAuthorization,
541        /// The responder for this request.
542        responder: I::RouteSetAuthenticateForInterfaceResponder,
543    },
544}
545
546impl From<fnet_routes_admin::RouteSetV4Request> for RouteSetRequest<Ipv4> {
547    fn from(value: fnet_routes_admin::RouteSetV4Request) -> Self {
548        match value {
549            fnet_routes_admin::RouteSetV4Request::AddRoute { route, responder } => {
550                RouteSetRequest::AddRoute { route: route.try_into(), responder }
551            }
552            fnet_routes_admin::RouteSetV4Request::RemoveRoute { route, responder } => {
553                RouteSetRequest::RemoveRoute { route: route.try_into(), responder }
554            }
555            fnet_routes_admin::RouteSetV4Request::AuthenticateForInterface {
556                credential,
557                responder,
558            } => RouteSetRequest::AuthenticateForInterface { credential, responder },
559        }
560    }
561}
562
563impl From<fnet_routes_admin::RouteSetV6Request> for RouteSetRequest<Ipv6> {
564    fn from(value: fnet_routes_admin::RouteSetV6Request) -> Self {
565        match value {
566            fnet_routes_admin::RouteSetV6Request::AddRoute { route, responder } => {
567                RouteSetRequest::AddRoute { route: route.try_into(), responder }
568            }
569            fnet_routes_admin::RouteSetV6Request::RemoveRoute { route, responder } => {
570                RouteSetRequest::RemoveRoute { route: route.try_into(), responder }
571            }
572            fnet_routes_admin::RouteSetV6Request::AuthenticateForInterface {
573                credential,
574                responder,
575            } => RouteSetRequest::AuthenticateForInterface { credential, responder },
576        }
577    }
578}
579
580/// GenericOverIp version of RouteTableV{4, 6}Request.
581#[derive(GenericOverIp, derivative::Derivative)]
582#[derivative(Debug(bound = ""))]
583#[generic_over_ip(I, Ip)]
584pub enum RouteTableRequest<I: FidlRouteAdminIpExt> {
585    /// Gets the table ID for the table
586    GetTableId {
587        /// Responder for the request.
588        responder: I::RouteTableGetTableIdResponder,
589    },
590    /// Detaches the table lifetime from the channel.
591    Detach {
592        /// Control handle to the protocol.
593        control_handle: I::RouteTableControlHandle,
594    },
595    /// Removes the table.
596    Remove {
597        /// Responder to the request.
598        responder: I::RouteTableRemoveResponder,
599    },
600    /// Gets the authorization for the route table.
601    GetAuthorizationForRouteTable {
602        /// Responder to the request.
603        responder: I::RouteTableGetAuthorizationResponder,
604    },
605    /// Creates a new route set for the table.
606    NewRouteSet {
607        /// The server end of the route set protocol.
608        route_set: fidl::endpoints::ServerEnd<I::RouteSetMarker>,
609        /// Control handle to the protocol.
610        control_handle: I::RouteTableControlHandle,
611    },
612}
613
614impl From<fnet_routes_admin::RouteTableV4Request> for RouteTableRequest<Ipv4> {
615    fn from(value: fnet_routes_admin::RouteTableV4Request) -> Self {
616        match value {
617            fnet_routes_admin::RouteTableV4Request::NewRouteSet { route_set, control_handle } => {
618                RouteTableRequest::NewRouteSet { route_set, control_handle }
619            }
620            fnet_routes_admin::RouteTableV4Request::GetTableId { responder } => {
621                RouteTableRequest::GetTableId { responder }
622            }
623
624            fnet_routes_admin::RouteTableV4Request::Detach { control_handle } => {
625                RouteTableRequest::Detach { control_handle }
626            }
627
628            fnet_routes_admin::RouteTableV4Request::Remove { responder } => {
629                RouteTableRequest::Remove { responder }
630            }
631            fnet_routes_admin::RouteTableV4Request::GetAuthorizationForRouteTable { responder } => {
632                RouteTableRequest::GetAuthorizationForRouteTable { responder }
633            }
634        }
635    }
636}
637
638impl From<fnet_routes_admin::RouteTableV6Request> for RouteTableRequest<Ipv6> {
639    fn from(value: fnet_routes_admin::RouteTableV6Request) -> Self {
640        match value {
641            fnet_routes_admin::RouteTableV6Request::NewRouteSet { route_set, control_handle } => {
642                RouteTableRequest::NewRouteSet { route_set, control_handle }
643            }
644            fnet_routes_admin::RouteTableV6Request::GetTableId { responder } => {
645                RouteTableRequest::GetTableId { responder }
646            }
647
648            fnet_routes_admin::RouteTableV6Request::Detach { control_handle } => {
649                RouteTableRequest::Detach { control_handle }
650            }
651
652            fnet_routes_admin::RouteTableV6Request::Remove { responder } => {
653                RouteTableRequest::Remove { responder }
654            }
655            fnet_routes_admin::RouteTableV6Request::GetAuthorizationForRouteTable { responder } => {
656                RouteTableRequest::GetAuthorizationForRouteTable { responder }
657            }
658        }
659    }
660}