Home | History | Annotate | Line # | Download | only in ServiceRegistration
      1  1.1  christos /* omr-publisher.h
      2  1.1  christos  *
      3  1.1  christos  * Copyright (c) 2023 Apple Inc. All rights reserved.
      4  1.1  christos  *
      5  1.1  christos  * Licensed under the Apache License, Version 2.0 (the "License");
      6  1.1  christos  * you may not use this file except in compliance with the License.
      7  1.1  christos  * You may obtain a copy of the License at
      8  1.1  christos  *
      9  1.1  christos  *     https://www.apache.org/licenses/LICENSE-2.0
     10  1.1  christos  *
     11  1.1  christos  * Unless required by applicable law or agreed to in writing, software
     12  1.1  christos  * distributed under the License is distributed on an "AS IS" BASIS,
     13  1.1  christos  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  1.1  christos  * See the License for the specific language governing permissions and
     15  1.1  christos  * limitations under the License.
     16  1.1  christos  *
     17  1.1  christos  * This file contains general support definitions for the Off-Mesh Routable
     18  1.1  christos  * (OMR) prefix publisher state machine.
     19  1.1  christos  */
     20  1.1  christos 
     21  1.1  christos #ifndef __OMR_PUBLISHER_H__
     22  1.1  christos #define __OMR_PUBLISHER_H__ 1
     23  1.1  christos 
     24  1.1  christos typedef struct dhcpv6_client dhcpv6_client_t;
     25  1.1  christos typedef struct br_event br_event_t;
     26  1.1  christos typedef struct omr_publisher omr_publisher_t;
     27  1.1  christos 
     28  1.1  christos #define OMR_PUBLISHER_START_WAIT	    15 * 1000 // Start wait interval is random(0..15) seconds
     29  1.1  christos #define OMR_PUBLISHER_DHCP_SUCCESS_WAIT      1500 // one and a half seconds (no need for jitter since we already jittered)
     30  1.1  christos #define OMR_PUBLISHER_MIN_START              3000 // three seconds (minimum, for new router coming to existing network)
     31  1.1  christos 
     32  1.1  christos RELEASE_RETAIN_DECLS(omr_publisher);
     33  1.1  christos #define omr_publisher_retain(publisher) omr_publisher_retain_(publisher, __FILE__, __LINE__)
     34  1.1  christos #define omr_publisher_release(publisher) omr_publisher_release_(publisher, __FILE__, __LINE__)
     35  1.1  christos void omr_publisher_cancel(omr_publisher_t *NONNULL publisher);
     36  1.1  christos omr_publisher_t *NULLABLE omr_publisher_create(route_state_t *NONNULL route_state, const char *NONNULL name);
     37  1.1  christos void omr_publisher_set_omr_watcher(omr_publisher_t *NONNULL omr_publisher, omr_watcher_t *NONNULL omr_watcher);
     38  1.1  christos void omr_publisher_set_reconnect_callback(omr_publisher_t *NONNULL omr_publisher,
     39  1.1  christos 										  void (*NULLABLE reconnect_callback)(void *NULLABLE context));
     40  1.1  christos void omr_publisher_start(omr_publisher_t *NONNULL publisher);
     41  1.1  christos omr_prefix_t *NULLABLE omr_publisher_published_prefix_get(omr_publisher_t *NONNULL publisher);
     42  1.1  christos void omr_publisher_force_publication(omr_publisher_t *NONNULL publisher, omr_prefix_priority_t priority);
     43  1.1  christos void omr_publisher_interface_configuration_changed(omr_publisher_t *NONNULL publisher);
     44  1.1  christos bool omr_publisher_publishing_dhcp(omr_publisher_t *NONNULL publisher);
     45  1.1  christos bool omr_publisher_publishing_ula(omr_publisher_t *NONNULL publisher);
     46  1.1  christos bool omr_publisher_publishing_prefix(omr_publisher_t *NONNULL publisher);
     47  1.1  christos 
     48  1.1  christos // The OMR publisher knows whether the prefix being published can be used for routing, even if it's not publishing it itself.
     49  1.1  christos // If there is a medium- or high-priority prefix published by some other router, that prefix can be assumed to be routable.
     50  1.1  christos // If the OMR publisher is publishing a DHCP route, that prefix can be assumed to be routable. If another router is publishing
     51  1.1  christos // a low-priority prefix, or OMR publisher is, that prefix can't be used for routing off of the adjacent infrastructure link.
     52  1.1  christos // Of course it still works for routing between Thread and the adjacent infrastructure link--what it can't be used for is
     53  1.1  christos // routing across a multi-link infrastructure network or to the internet.
     54  1.1  christos bool omr_publisher_have_routable_prefix(omr_publisher_t *NONNULL publisher);
     55  1.1  christos 
     56  1.1  christos // Check that the prefix that we saw in an RA is not also the one we are publishing on Thread. This can happen with broken DHCP
     57  1.1  christos // PD servers, and we have seen it in some home routers.
     58  1.1  christos void omr_publisher_check_prefix(omr_publisher_t *NULLABLE publisher, struct in6_addr *NONNULL prefix, int len);
     59  1.1  christos 
     60  1.1  christos void omr_publisher_unpublish_prefix(omr_publisher_t *NONNULL publisher);
     61  1.1  christos #endif // __OMR_PUBLISHER_H__
     62  1.1  christos 
     63  1.1  christos // Local Variables:
     64  1.1  christos // mode: C
     65  1.1  christos // tab-width: 4
     66  1.1  christos // c-file-style: "bsd"
     67  1.1  christos // c-basic-offset: 4
     68  1.1  christos // fill-column: 120
     69  1.1  christos // indent-tabs-mode: nil
     70  1.1  christos // End:
     71