|  | 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; | 
|  | } |