| syntax = "proto3"; | 
 |  | 
 | // This package provides a configuration format for configuring IP-based | 
 | // networking on Linux. This is going to be used in cases where automatic | 
 | // configuration by Monogon's network stack is infeasible or network | 
 | // configuration information needs to be provided to non-Monogon systems. | 
 | // It's kept human-readable as it may be written by humans directly when | 
 | // configuring Monogon systems. | 
 | package net.proto; | 
 | option go_package = "source.monogon.dev/net/proto"; | 
 |  | 
 | // Device references one or more network adapters, i.e. network devices which | 
 | // connect this kernel to an outside system. | 
 | // All conditions which are set in the message are ANDed together. | 
 | message Device { | 
 |   // Matches the permanent hardware address of the interface. The raw address | 
 |   // is hex-encoded and colons are inserted between every byte boundary. | 
 |   // This is the MAC address on Ethernet interfaces. | 
 |   string hardware_address = 1; | 
 |   // Matches the Linux driver of the network interface | 
 |   string driver = 2; | 
 |   // In case of multiple matches, use the n-th interface instead of the first. | 
 |   int32 index = 3; | 
 | } | 
 | // Bond defines an aggregate of physical layer 2 links which behave as one | 
 | // virtual layer 2 link. This includes active-passive as well as active- | 
 | // active configurations with two or more links. | 
 | message Bond { | 
 |   // List of interface names which are a member of this bond. It's recommended | 
 |   // to only use Device-type interfaces here as others might behave | 
 |   // unexpectedly (Bond on VLAN interfaces) or fail to be configured entirely | 
 |   // (Bond on Bond). All interface names listed here must exist as part of the | 
 |   // same Net message as this Bond interface. | 
 |   repeated string member_interface = 1; | 
 |   // Minimum number of links to be up to consider the bond to be up. | 
 |   // Can be used in case expected bandwith is more than a single interface | 
 |   // can take in which case it might be preferable to not pass any traffic | 
 |   // over causing significant packet loss. | 
 |   int32 min_links = 2; | 
 |   message CarrierMonitor { | 
 |     // Interval at which the PCS is polled for physical link status if Linux's | 
 |     // carrier monitoring is not available. | 
 |     int32 polling_interval_ms = 1; | 
 |     // Disable the use of Linux's carrier monitoring which can use interrupts | 
 |     // and force polling in all cases. | 
 |     bool force_polling = 4; | 
 |     // Amount of time to delay marking the link as down in the bond after the | 
 |     // carrier has been lost. Should be a multiple of polling_interval_ms. | 
 |     int32 down_delay_ms = 2; | 
 |     // Amount of time to delay marking the link as up in the bond after the | 
 |     // carrier is available. Should be a multiple of polling_interval_ms. | 
 |     int32 up_delay_ms = 3; | 
 |   } | 
 |   oneof link_monitor { | 
 |     CarrierMonitor carrier_monitor = 3; | 
 |     // TODO(#186): Support ARP monitor for other modes | 
 |   } | 
 |   enum TransmitHashPolicy { | 
 |     // Layer 2 MAC address | 
 |     LAYER2 = 0; | 
 |     // IP address, protocol and port | 
 |     LAYER3_4 = 1; | 
 |     // MAC address and IP address | 
 |     LAYER2_3 = 2; | 
 |     // Encapsulated MAC address and IP address | 
 |     ENCAP_LAYER2_3 = 3; | 
 |     // Encapsulated IP address, protocol and port | 
 |     ENCAP_LAYER3_4 = 4; | 
 |     // VLAN ID and source MAC | 
 |     VLAN_SRCMAC = 5; | 
 |   } | 
 |   TransmitHashPolicy transmit_hash_policy = 4; | 
 |   // Use the Link Aggregation Control Protocol to automatically use the | 
 |   // available links as best as possible. | 
 |   message LACP { | 
 |     enum Rate { | 
 |       // LACP slow rate, one packet every 30s | 
 |       SLOW = 0; | 
 |       // LACP fast rate, one packet every 1s | 
 |       FAST = 1; | 
 |     } | 
 |     Rate rate = 1; | 
 |     enum SelectionLogic { | 
 |       STABLE = 0; | 
 |       BANDWIDTH = 1; | 
 |       COUNT = 2; | 
 |     } | 
 |     SelectionLogic selection_logic = 2; | 
 |     int32 actor_system_priority = 3; | 
 |     int32 user_port_key = 4; | 
 |     string actor_system_mac = 5; | 
 |   } | 
 |   message ActiveBackup { | 
 |     // TODO(#186): More settings | 
 |   } | 
 |   oneof mode { | 
 |     LACP lacp = 5; | 
 |     ActiveBackup active_backup = 6; | 
 |   } | 
 | } | 
 |  | 
 | message VLAN { | 
 |   // Name of the parent interface passing tagged packets. The interface | 
 |   // referenced here must exist in the same Net message as this VLAN | 
 |   // interface. | 
 |   string parent = 1; | 
 |   // VLAN ID (1-4094) | 
 |   int32 id = 2; | 
 |   enum Protocol { | 
 |     // C-VLAN, also known as "standard" VLAN inserts a header with the | 
 |     // VLAN ID (VID) right before the EtherType. | 
 |     CVLAN = 0; | 
 |     // S-VLAN, also known as QinQ or 802.1ad (obsolete) inserts a second VLAN ID | 
 |     // before the C-VLAN header. This allows stacking two VLANs. The ID | 
 |     // specified here is just for the outer VLAN, the inner one can be set by | 
 |     // creating another VLAN interface and setting this one to be its parent. | 
 |     SVLAN = 1; | 
 |   } | 
 |   Protocol protocol = 3; | 
 | } | 
 |  | 
 | // IPv4Autoconfig contains settings for the automatic configuration of IPv4 | 
 | // addresses, routes and further network information via DHCPv4. | 
 | message IPv4Autoconfig {} | 
 |  | 
 | // IPv6Autoconfig contains settings for the automatic configuration of IPv6 | 
 | // addreses, routes and further network information via ICMPv6 Router | 
 | // Advertisements and optionally DHCPv6 if indicated by the Router | 
 | // Advertisement. | 
 | message IPv6Autoconfig { | 
 |   enum Privacy { | 
 |     // Do not generate privacy addresses. | 
 |     DISABLE = 0; | 
 |     // Generate privacy addresses, but prefer non-privacy addresses. | 
 |     AVOID = 1; | 
 |     // Generate privacy addresses and use them over other non-privacy | 
 |     // addresses. | 
 |     PREFER = 2; | 
 |   } | 
 |   // privacy controls if and how privacy addresses (see RFC 4941) are used if | 
 |   // DHCPv6 is not used for addressing. If DHCPv6 is used for addressing | 
 |   // any privacy considerations lie with the DHCPv6 server. | 
 |   Privacy privacy = 1; | 
 | } | 
 |  | 
 | message Interface { | 
 |   // Name of the interface. Used as a reference in this config as well as for | 
 |   // the name of the kernel interface. Must not be empty, less than 16 UTF-8 | 
 |   // bytes long and cannot contain spaces, forward slashes, colons or percent | 
 |   // signs. The UTF-8 encoding can also not include 0xa0 which is interpreted | 
 |   // as a space by Linux since its ctype database is based on Latin1. | 
 |   string name = 1; | 
 |  | 
 |   // Type of interface | 
 |   oneof type { | 
 |     Device device = 3; | 
 |     Bond bond = 4; | 
 |     VLAN vlan = 5; | 
 |   } | 
 |   // Enable automatic IPv4 network configuration via DHCPv4. | 
 |   IPv4Autoconfig ipv4_autoconfig = 10; | 
 |  | 
 |   // Enable automatic IPv6 network configuration via router advertisements and | 
 |   // DHCPv6. | 
 |   IPv6Autoconfig ipv6_autoconfig = 11; | 
 |  | 
 |   // IP addresses to be statically configured. These can either be single | 
 |   // IP addresses (both IPv4 and IPv6) as well as CIDR-style networks for | 
 |   // which a corresponding route is automatically added. If single IP addreses | 
 |   // are used, a corresponding route must be added, otherwise no traffic will | 
 |   // be routed out of the interface. | 
 |   repeated string address = 12; | 
 |  | 
 |   message Route { | 
 |     // Destination in CIDR form or as a single IP. | 
 |     string destination = 1; | 
 |  | 
 |     // If set, the destination network is not directly on-link, but reachable | 
 |     // via a gateway which is on-link. On point-to-point networks without | 
 |     // ARP/NDP this doesn't do anything should never be set. | 
 |     // Note that here, different from other network configs, the gateway IP (if | 
 |     // configured) is assumed to be on-link for the interface it's configured | 
 |     // under. Configuring a route with a gateway IP which is routed to another | 
 |     // interface is invalid. | 
 |     string gateway_ip = 2; | 
 |  | 
 |     // An optional hint to the kernel which source address to prefer when using | 
 |     // this route. | 
 |     string source_ip = 3; | 
 |  | 
 |     // Metric of this interface route. A lower metric route wins over one with a | 
 |     // higher metric. If unset, defaults to 0 which is the default metric in | 
 |     // Linux. | 
 |     int32 metric = 4; | 
 |   } | 
 |   // List of routes which direct traffic into this interface. | 
 |   repeated Route route = 14; | 
 |  | 
 |   // Maximum transmission unit of the interface. If unset it will be | 
 |   // automatically configured by DHCP or LLDP or left at the interface default | 
 |   // value. Minimum value is 1280 bytes as required by IPv6. | 
 |   int32 mtu = 13; | 
 | } | 
 |  | 
 | message Nameserver { | 
 |   // The IP address of the nameserver in string form. | 
 |   string ip = 1; | 
 | } | 
 |  | 
 | // Net contains a network configuration for a single network namespace. | 
 | // | 
 | // This is effectively the top-level configuration message for a machine. | 
 | message Net { | 
 |   repeated Interface interface = 1; | 
 |   repeated Nameserver nameserver = 3; | 
 | } |