ovn-ic-sb(5)
πΈ ovn-ic-sb πΈ
the ovn-ic-sb(5) page, bestie β straight out of the Open vSwitch Manual. This is the OVN_IC_Southbound database schema and yes she is a whole vibe, let's get into it π
β¨ NAME β¨
ovn-ic-sb β the OVN_IC_Southbound database schema. That's her. That's the name. Iconic behavior honestly π
π¦ DESCRIPTION π¦
okay so listen. This database holds configuration and state for interconnecting different OVN deployments. The content of the database is populated and used by the ovn-ic program in each OVN deployment, and it is not supposed to be directly used by CMS or end user. Like, hands off, she's not for you personally π
The OVN Interconnection Southbound database is shared by ovn-ic program in each OVN deployment. It contains interconnection information from all related OVN deployments, and it's used as the intermediate store for each OVN deployment to exchange the information. The ovn-ic program in each deployment is the one responsible for syncing the data between this database and its own northbound and southbound databases. she's the group chat that keeps everyone in the loop, fr fr π¬
π§ Database Structure
The OVN Interconnection Southbound database contains classes of data with different properties, as described in the sections below. different flavors, same girl β¨
π Availability Zone Specific Information
These tables contain objects that are availability zone specific. Each object is owned and populated by one availability zone, and read by other availability zones. it's giving "I made this, but you can look" π
The Availability_Zone, Gateway, Encap and Port_Binding tables are the availability zone specific tables.
π Global Information
The data that does not belong to any specific availability zone but is common for all availability zones. everyone's business, no gatekeeping π«Ά
The Datapath_Binding table contains the common datapath binding information.
π Common Columns
Each of the tables in this database contains a special column, named external_ids. This column has the same form and purpose each place it appears. consistency queen β
external_ids: map of string-string pairs β key-value pairs for use byovn-ic.
π TABLE SUMMARY π
The following list summarizes the purpose of each of the tables in the OVN_IC_Southbound database. Each table is described in more detail on a later page. (later page!! we love a multi-part reveal π)
IC_SB_Globalβ IC Southbound configurationAvailability_Zoneβ Availability Zone InformationGatewayβ Interconnection Gateway InformationEncapβ Encapsulation TypesDatapath_Bindingβ Transit Switch Datapath BindingsPort_Bindingβ Transit Port BindingsRouteβ RouteConnectionβ OVSDB client connections.SSLβ SSL configuration.Service_Monitorβ Service_Monitor configuration.Address_Setβ Address Sets
π IC_SB_Global TABLE π
Interconnection Southbound configuration. This table must have exactly one row. one row. singular. do not test her. π
Summary:
Status:
nb_ic_cfg integer
Common Columns:
external_ids map of string-string pairs
options map of string-string pairs
Connection Options:
connections set of Connections
ssl optional SSL
Details:
Status:
This column allows a client to track the overall configuration state of the system. she's the vibe check for the whole config π«Ά
nb_ic_cfg: integer β Sequence number for the configuration. When a CMS orovn-ic-nbctlupdates the Interconnect northbound database, it increments thenb_ic_cfgcolumn in theNB_IC_Globaltable in the Interconnect northbound database. When OVN-ICs updates the southbound database to bring it up to date with these changes, one OVN-IC updates this column to the same value. it's a little "we're all caught up β¨" handshake.
Common Columns:
external_ids: map of string-string pairs β See External IDs at the beginning of this document.options: map of string-string pairs β that's the whole entry. no notes. π
Connection Options:
connections: set ofConnectionsβ Database clients to which the Open vSwitch database server should connect or on which it should listen, along with options for how these connections should be configured. See theConnectiontable for more information.ssl: optionalSSLβ Global SSL/TLS configuration.
π¦ Availability_Zone TABLE π¦
Each row in this table represents an Availability Zone. Each OVN deployment is considered an availability zone from the OVN control plane perspective, with its own central components, such as northbound and southbound databases and the ovn-northd daemon. every deployment is the main character of its own zone, no cap π
Summary:
name string (must be unique within table)
nb_ic_cfg integer
Details:
name: string (must be unique within table) β A name that uniquely identifies the availability zone. must be unique, so don't be out here duplicating, bestie πnb_ic_cfg: integer β This column is used by the OVN-IC to inform that this IC instance is aligned with the changes in INB.
πͺ Gateway TABLE πͺ
Each row in this table represents an interconnection gateway chassis in an availability zone.
Summary:
name string (must be unique within table)
availability_zone Availability_Zone
hostname string
Common Columns:
external_ids map of string-string pairs
Encapsulation Configuration:
encaps set of 1 or more Encaps
Details:
name: string (must be unique within table) β The name of the gateway. See thenamecolumn of the OVN Southbound database'sChassistable.availability_zone:Availability_Zoneβ The availability zone that the gateway belongs to.hostname: string β The hostname of the gateway.
π Common Columns:
The overall purpose of these columns is described under Common Columns at the beginning of this document.
external_ids: map of string-string pairs
π Encapsulation Configuration:
OVN uses encapsulation to transmit logical dataplane packets between gateways.
encaps: set of 1 or moreEncapsβ Points to supported encapsulation configurations to transmit logical dataplane packets to this gateway. Each entry is anEncaprecord that describes the configuration. See theencapscolumn of the OVN Southbound database'sChassistable.
π Encap TABLE π
The encaps column in the Gateway table refers to rows in this table to identify how OVN may transmit logical dataplane packets to this gateway.
Summary:
type string, either geneve or vxlan
options map of string-string pairs
ip string
gateway_name string
Details:
type: string, eithergeneveorvxlanβ The encapsulation to use to transmit packets to this gateway. See thetypecolumn of the OVN Southbound database'sEncaptable.options: map of string-string pairs β Options for configuring the encapsulation, which may be type specific. See theoptionscolumn of the OVN Southbound database'sEncaptable.ip: string β The IPv4 address of the encapsulation tunnel endpoint.gateway_name: string β The name of the gateway that created this encap.
π€οΈ Datapath_Binding TABLE π€οΈ
Each row in this table represents a logical datapath for a transit logical switch configured in the OVN Interconnection Northbound database's Transit_Switch table.
Summary:
transit_switch string
type optional string, either transit-router or
transit-switch
nb_ic_uuid optional uuid
tunnel_key integer, in range 1 to 16,777,215
Common Columns:
external_ids map of string-string pairs
Details:
transit_switch: string β The name of the transit logical switch or router that is configured in the OVN Interconnection Northbound database'sTransit_SwitchorTransit_Routertable. Note: the name of transit router is stored in the same column due to backward compatibility. legacy support ate and left no crumbs πtype: optional string, eithertransit-routerortransit-switchβ Can be one oftransit-switchortransit-router.nb_ic_uuid: optional uuid β This is the UUID of the corresponding northbound IC logical datapath represented by this southboundDatapath_Binding.tunnel_key: integer, in range 1 to 16,777,215 β The tunnel key value to which the logical datapath is bound. The key can be generated by anyovn-icbut the same key is shared by all availability zones so that the logical datapaths can be peered across them. A tunnel key for transit switch datapath binding must be globally unique. no dupes allowed, she said what she said β
For more information about the meanings of a tunnel key, see the tunnel_key column of the OVN Southbound database's Datapath_Binding table.
π Common Columns:
The overall purpose of these columns is described under Common Columns at the beginning of this document.
external_ids: map of string-string pairs
πΈ Port_Binding TABLE πΈ
Okay bestie, this one is so important. Every single row in here is basically making a promise: it binds a logical port on the transit switch to a physical gateway and a tunnel key. And every port on the transit switch belongs to one specific availability zone. That's the whole vibe. No cap. β¨
π Summary π
π Core Features π
transit_switchβ stringlogical_portβ string (must be unique within table)availability_zoneβ Availability_Zoneencapβ optional weak reference to Encapgatewayβ stringtunnel_keyβ integer, in range 1 to 32,767addressβ stringtypeβ optional string, eithertransit-router-portortransit-switch-portnb_ic_uuidβ optional uuid
π¦ Common Columns π¦
external_idsβ map of string-string pairs
π Details π
β¨ Core Features β¨
transit_switchβ string. The name of the transit switch that the corresponding logical port belongs to. Like, which switch are we even on, bestie? This is how you find out. π€οΈlogical_portβ string (must be unique within table). A logical port, taken fromnamein the OVN_Northbound database'sLogical_Switch_Porttable. Heads up: the logical port name has to be unique across all availability zones. All of them. Every single one. πavailability_zoneβ Availability_Zone. The availability zone that the port belongs to. Its home, its little AZ apartment. πencapβ optional weak reference to Encap. Points to supported encapsulation configurations to transmit logical dataplane packets to this gateway. Each entry is anEncaprecord that describes the configuration. π¦gatewayβ string. The name of the gateway that this port is physically located. Physically!! As in, real hardware somewhere. π₯οΈtunnel_keyβ integer, in range 1 to 32,767. A number that represents the logical port in the key (e.g. Geneve TLV) field carried within tunnel protocol packets. The key can be generated by anyovn-ic, but the same key is shared by all availability zones so that the packets can go through the datapath pipelines of different availability zones. It's giving teamwork honestly. π€
The tunnel ID must be unique within the scope of a logical datapath. That part is not optional, bestie.
For more information about tunnel key, see tunnel_key column of the OVN Southbound database's Port_Binding table. Go read that too, iykyk. π
addressβ string. The Ethernet address and IP addresses used by the corresponding logical router port peering with the transit switch port. It's a string combined with the value ofmaccolumn followed by the values innetworkscolumn inLogical_Router_Porttable. So like, mac first, then the networks. Don't mix up the order. πtypeβ optional string, eithertransit-router-portortransit-switch-port. Can be one ofswitch-portorrouter-port. πnb_ic_uuidβ optional uuid. This is the UUID of the corresponding northbound IC logical datapath represented by this southboundDatapath_Binding. The little paper trail linking north to south. π§Ύ
π Common Columns π
external_idsβ map of string-string pairs. See External IDs at the beginning of this document. (Yes, go look, it's up there. π)
π Route TABLE π
Every row in this table represents a route advertised. That's it, that's the whole job. A little announcement to the world: hey, this route exists. π£
π« Summary π«
π₯ Core Features π₯
transit_switchβ stringavailability_zoneβ Availability_Zoneroute_tableβ stringip_prefixβ stringnexthopβ stringoriginβ string, one ofconnected-dynamic,connected,loadbalancer, orstatic
π Common Columns π
external_idsβ map of string-string pairs
π§ Options π§
optionsβ map of string-string pairsoptions : override-connectedβ optional string, eithertrueorfalse
π Details π
π Core Features π
transit_switchβ string. The name of the transit switch, upon which the route is advertised. That's the stage the route is performing on. π€availability_zoneβ Availability_Zone. The availability zone that has advertised the route. Like, who said it? This column. π£οΈroute_tableβ string. Route table within which this route was created. Empty value means<main>routing table.
Okay so here's the lore: routes for directly-connected networks will be learned to <main> routing table, and if Logical Routers have more than one Transit Switch, which interconnects them, directly-connected routes will be added via each transit switch port and configured as ECMP routes. Additionally, these routes will be advertised to other AZ and learned into route table that has the same name in the remote logical router. When learned, these routes are automatically marked with the override-connected option, giving them higher priority than any local connected route with same prefix in that route table. This enables policy-based routing scenarios where traffic processed within a specific route table can be forcibly forwarded to remote AZ even when local connected route exists. Forcibly forwarded. It's that serious. π₯
Static routes within route tables will be advertised and learned only if interconnecting transit switch's LRPs will have same value in options:route_table as NB route_table or ICSB route_table value respectively. Matching values or it's not happening, periodt. β
ip_prefixβ string. IP prefix of this route (e.g.192.168.100.0/24). π―nexthopβ string. Nexthop IP address for this route. Where you're headed next, babe. β‘οΈoriginβ string, one ofconnected-dynamic,connected,loadbalancer, orstatic. Can be one ofconnected,static,connected-dynamicorloadbalancer. Here's the breakdown, bestie:- Routes to directly-connected subnets β LRP's CIDRs β are inserted to OVN IC SB DB with
connectedvalue inorigin. - Static routes are inserted to OVN IC SB DB with
staticvalue. - Routes for LB VIPs are inserted in OVN IC SB DB with
loadbalancervalue. - Routes learned from dynamic routing are inserted in OVN IC SB DB with
connected-dynamicvalue.
- Routes to directly-connected subnets β LRP's CIDRs β are inserted to OVN IC SB DB with
Next, when route is learned to another AZ NB DB by ovn-ic, route origin is synced to options:origin. So it travels with its receipts. π§Ύβ¨
π¦ Common Columns π¦
external_idsβ map of string-string pairs. See External IDs at the beginning of this document.
π Options π
optionsβ map of string-string pairs. This column provides general key/value settings. The supported options are described individually below. πoptions : override-connectedβ optional string, eithertrueorfalse. This option is a copy of its Northbound DB counterpart.
For connected routes this option is set to true if there is a route table associated with given connected route, i.e. route_table is not empty. Empty route_table? Then nope, not true. Simple as that. π
πΈ Connection TABLE πΈ
So this table is literally the blueprint for how you connect to an Open vSwitch database (OVSDB) client. It's giving networking matchmaker energy. π
Fun fact bestie: this table is mostly out here configuring the Open vSwitch database server itself (ovsdb-server). The OVSDB server can be the one to initiate and maintain active connections to remote clients, and it can also just sit there and listen for database connections like the main character it is. π
β¨ Summary β¨
Core Features:
targetβ string (must be unique within table)
Client Failure Detection and Handling:
max_backoffβ optional integer, at least1,000inactivity_probeβ optional integer
Status:
is_connectedβ booleanstatus : last_errorβ optional stringstatus : stateβ optional string, one ofACTIVE,BACKOFF,CONNECTING,IDLE, orVOIDstatus : sec_since_connectβ optional string, containing an integer, at least0status : sec_since_disconnectβ optional string, containing an integer, at least0status : locks_heldβ optional stringstatus : locks_waitingβ optional stringstatus : locks_lostβ optional stringstatus : n_connectionsβ optional string, containing an integer, at least2status : bound_portβ optional string, containing an integer
Common Columns:
external_idsβ map of string-string pairsother_configβ map of string-string pairs
π Details π
π Core Features
target: string (must be unique within table) β Connection methods for clients.
The following connection methods are currently supported, bestie:
ssl:host[:port]β The specified SSL/TLS port on the givenhost, which can either be a DNS name (if built with unbound library) or an IP address. A valid SSL/TLS configuration must be provided when this form is used, and that config can be specified via command-line options or theSSLtable.
If port is not specified, it defaults to 6640.
Real talk: SSL/TLS support is an optional feature that is not always built as part of OVN or Open vSwitch. π
tcp:host[:port]β The specified TCP port on the givenhost, which can either be a DNS name (if built with unbound library) or an IP address (IPv4 or IPv6). Ifhostis an IPv6 address, wrap it in square brackets, e.g.tcp:[::1]:6640.
If port is not specified, it defaults to 6640.
pssl:[port][:host]β Listens for SSL/TLS connections on the specified TCPport. Specify0forportto have the kernel automatically choose an available port. Ifhost, which can either be a DNS name (if built with unbound library) or an IP address, is specified, then connections are restricted to the resolved or specified local IP address (either IPv4 or IPv6 address). Ifhostis an IPv6 address, wrap in square brackets, e.g.pssl:6640:[::1]. Ifhostis not specified then it listens only on IPv4 (but not IPv6) addresses. A valid SSL/TLS configuration must be provided when this form is used, and this can be specified either via command-line options or theSSLtable.
If port is not specified, it defaults to 6640.
Again, not to be dramatic but SSL/TLS support is an optional feature that is not always built as part of OVN or Open vSwitch. π
ptcp:[port][:host]β Listens for connections on the specified TCPport. Specify0forportto have the kernel automatically choose an available port. Ifhost, which can either be a DNS name (if built with unbound library) or an IP address, is specified, then connections are restricted to the resolved or specified local IP address (either IPv4 or IPv6 address). Ifhostis an IPv6 address, wrap it in square brackets, e.g.ptcp:6640:[::1]. Ifhostis not specified then it listens only on IPv4 addresses.
If port is not specified, it defaults to 6640.
β οΈ When multiple clients are configured, thetargetvalues must be unique. Duplicatetargetvalues yield unspecified results. Not it being the chaos agent, fr fr.
π¦ Client Failure Detection and Handling
max_backoff: optional integer, at least1,000β Maximum number of milliseconds to wait between connection attempts. Default is implementation-specific.inactivity_probe: optional integer β Maximum number of milliseconds of idle time on connection to the client before sending an inactivity probe message. If Open vSwitch does not communicate with the client for the specified number of seconds, it will send a probe. If a response is not received for the same additional amount of time, Open vSwitch assumes the connection has been broken and attempts to reconnect. Default is implementation-specific. A value of0disables inactivity probes.
π Status
Okay so the tea here: the key-value pair of is_connected is always updated. The other key-value pairs in the status columns may be updated, and it depends on the target type. π
When target specifies a connection method that listens for inbound connections (e.g. ptcp: or punix:), both n_connections and is_connected may also be updated, while the remaining key-value pairs are omitted.
On the other hand, when target specifies an outbound connection, all key-value pairs may be updated, except the above-mentioned two key-value pairs associated with inbound connection targets. Those two are omitted. Slay, that's just how it works. β¨
is_connected: boolean βtrueif currently connected to this client,falseotherwise.status : last_error: optional string β A human-readable description of the last error on the connection to the manager; i.e.strerror(errno). This key will exist only if an error has occurred. πstatus : state: optional string, one ofACTIVE,BACKOFF,CONNECTING,IDLE, orVOIDβ The state of the connection to the manager:VOIDβ Connection is disabled.BACKOFFβ Attempting to reconnect at an increasing period.CONNECTINGβ Attempting to connect.ACTIVEβ Connected, remote host responsive.IDLEβ Connection is idle. Waiting for response to keep-alive.
Heads up bestie: these values may change in the future. They are provided only for human consumption. π
status : sec_since_connect: optional string, containing an integer, at least0β The amount of time since this client last successfully connected to the database (in seconds). Value is empty if client has never successfully been connected.status : sec_since_disconnect: optional string, containing an integer, at least0β The amount of time since this client last disconnected from the database (in seconds). Value is empty if client has never disconnected.status : locks_held: optional string β Space-separated list of the names of OVSDB locks that the connection holds. Omitted if the connection does not hold any locks.status : locks_waiting: optional string β Space-separated list of the names of OVSDB locks that the connection is currently waiting to acquire. Omitted if the connection is not waiting for any locks.status : locks_lost: optional string β Space-separated list of the names of OVSDB locks that the connection has had stolen by another OVSDB client. Omitted if no locks have been stolen from this connection. Rude of them tbh. π€status : n_connections: optional string, containing an integer, at least2β Whentargetspecifies a connection method that listens for inbound connections (e.g.ptcp:orpssl:) and more than one connection is actually active, the value is the number of active connections. Otherwise, this key-value pair is omitted.status : bound_port: optional string, containing an integer β Whentargetisptcp:orpssl:, this is the TCP port on which the OVSDB server is listening. (This is particularly useful whentargetspecifies a port of0, allowing the kernel to choose any available port.) β¨
π Common Columns
The overall purpose of these columns is described under Common Columns at the beginning of this document. Iykyk. π
external_ids: map of string-string pairsother_config: map of string-string pairs
π SSL TABLE π
Okay bestie, this one is literally the SSL/TLS glow-up for ovn-sb database access. It's how you tell the switch who it is and who it trusts. β¨
Summary:
private_key string
certificate string
ca_cert string
bootstrap_ca_cert boolean
ssl_protocols string
ssl_ciphers string
ssl_ciphersuites string
Common Columns:
external_ids map of string-string pairs
Details:
private_key: string β Name of a PEM file holding the private key that's used as the switch's identity for SSL/TLS connections to the controller. It's giving "who am I" energy fr.certificate: string β Name of a PEM file with a certificate inside, signed by the certificate authority (CA) that the controller and manager use. This cert certifies the switch's private key, and it's what identifies a trustworthy switch. πca_cert: string β Name of a PEM file with the CA certificate, used to verify that the switch is actually connected to a trustworthy controller. Vibe check on the other end, basically. π«Άbootstrap_ca_cert: boolean β If you set this totrue, Open vSwitch will attempt to grab the CA certificate from the controller on its very first SSL/TLS connection and save it into the named PEM file. If it works, it immediately drops the connection and reconnects β and from then on, every SSL/TLS connection has to be authenticated by a certificate signed by the CA cert it just obtained.
β οΈ Bestie listen. This option exposes the SSL/TLS connection to a man-in-the-middle attack that can obtain the initial CA certificate. It may still be useful for bootstrapping, but like... know what you're doing. π
ssl_protocols: string β A range, or a comma- or space-delimited list, of the SSL/TLS protocols to enable for SSL/TLS connections.
Supported protocols include TLSv1.2 and TLSv1.3. Ranges can be given as two protocol names separated with a dash (TLSv1.2-TLSv1.3), or as a single protocol name with a plus sign (TLSv1.2+). The value can be a list of protocols or exactly one range. The range is the preferred way to specify protocols, and the config always behaves as if the range between the minimum and maximum specified version was provided β i.e., if the value is set to TLSv1.X,TLSv1.(X+2), then TLSv1.(X+1) will also be enabled as if it was a range. Regardless of order, the highest protocol supported by both sides gets chosen when making the connection. π
The default when this option is omitted is TLSv1.2+.
ssl_ciphers: string β List of ciphers (in OpenSSL cipher string format) to be supported for SSL/TLS connections with TLSv1.2. The default when this option is omitted isDEFAULT:@SECLEVEL=2.ssl_ciphersuites: string β List of ciphersuites (in OpenSSL ciphersuites string format) to be supported for SSL/TLS connections with TLSv1.3 and later. The default value from OpenSSL is used when this option is omitted.
Common Columns:
The overall purpose of these columns is described under Common Columns at the beginning of this document.
external_ids: map of string-string pairs β yeah, that one. Standard issue. β¨
πΈ Service_Monitor TABLE πΈ
Summary:
type optional string, must be load-balancer
ip string
protocol optional string, either tcp or udp
port integer, in range 0 to 65,535
logical_port string
src_ip string
src_mac string
status optional string, one of error, offline, or
online
target_availability_zone string
source_availability_zone string
options map of string-string pairs
external_ids map of string-string pairs
Details:
- **
type: optional string, must be load-balancer** β The type of the service. Only the value"load-balancer"` is supported. That's the whole menu, bestie. π ip: string β IP of the service that's being monitored. Copy from SBDB record.protocol: optional string, eithertcporudpβ The protocol of the service. Copy from the source Southbound Database record.port: integer, in range 0 to 65,535 β The TCP or UDP port of the service. Copy from the source Southbound Database record.logical_port: string β The VIF of the logical port that the service is running on. Theovn-controllerthat binds thislogical_portmonitors the service by sending periodic monitor packets. Copy from the source Southbound Database record. π¦src_ip: string β Source IPv4 or IPv6 address to use in the service monitor packet. Copy from the source Southbound Database record.src_mac: string β Source Ethernet address to use in the service monitor packet. Copy from the Southbound Database record.status: optional string, one oferror,offline, oronlineβ The health status of the service monitor, synchronized from the target Southbound Database. Vibe check: are you online or not. πtarget_availability_zone: string β The Availability Zone where the monitored service endpoint is located.source_availability_zone: string β The Availability Zone that initiated this monitor entry in ICSB and retains ownership for lifecycle management. She's the main character of this entry's whole life, no cap. πoptions: map of string-string pairs β Same as in TableService_Monitorin SBDB. Copy from source SBDB record.external_ids: map of string-string pairs β Same as in TableService_Monitorin SBDB. Copy from source SBDB record.
π Address_Set TABLE π
Each row in this table represents an advertised Address_Set. The combination of name and availability_zone is unique: each availability zone may advertise at most one address set with a given name. If multiple availability zones advertise address sets with the same name, a learning availability zone will merge the addresses from all of them into a single Northbound Address_Set entry. Group project that actually works. β¨
Summary:
name string
addresses set of strings
availability_zone Availability_Zone
Common Columns:
external_ids map of string-string pairs
Details:
name: string β A name for the address set. Names are ASCII and must match[a-zA-Z_.][a-zA-Z_.0-9]*. So like, no wild chaos characters bestie. πΈaddresses: set of strings β The set of addresses in string form.availability_zone: Availability_Zone β The availability zone that has advertised theAddress_Set.
Common Columns:
external_ids: map of string-string pairs β See External IDs at the beginning of this document.
And that's the whole page, bestie!! π You just read the entirety of ovn-ic-sb(5) and honestly? Iconic behaviour. π
This was served up by Open vSwitch 26.09.1, riding on DB Schema 2.7.0, and it's the ovn-ic-sb(5) manual page. π Go forth and configure your southbound database like the main character you are. π«Άβ¨
π¦ where this page comes from
- fedora 44: ovn 26.09.0-33.fc44 Β· Apache-2.0 AND LGPL-2.1-only AND SISSL
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms