| // Copyright 2015 CNI authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package main |
| |
| import ( |
| "fmt" |
| "net" |
| "strconv" |
| |
| dhcp4 "github.com/insomniacslk/dhcp/dhcpv4" |
| |
| "github.com/containernetworking/cni/pkg/types" |
| ) |
| |
| var optionNameToID = map[string]dhcp4.OptionCode{ |
| "dhcp-client-identifier": dhcp4.OptionClientIdentifier, |
| "subnet-mask": dhcp4.OptionSubnetMask, |
| "routers": dhcp4.OptionRouter, |
| "host-name": dhcp4.OptionHostName, |
| "user-class": dhcp4.OptionUserClassInformation, |
| "vendor-class-identifier": dhcp4.OptionClassIdentifier, |
| } |
| |
| func parseOptionName(option string) (dhcp4.OptionCode, error) { |
| if val, ok := optionNameToID[option]; ok { |
| return val, nil |
| } |
| i, err := strconv.ParseUint(option, 10, 8) |
| if err != nil { |
| return dhcp4.OptionPad, fmt.Errorf("Can not parse option: %w", err) |
| } |
| return dhcp4.GenericOptionCode(i), nil |
| } |
| |
| func classfulSubnet(sn net.IP) net.IPNet { |
| return net.IPNet{ |
| IP: sn, |
| Mask: sn.DefaultMask(), |
| } |
| } |
| |
| func parseRoutes(opt []byte) []*types.Route { |
| // StaticRoutes format: pairs of: |
| // Dest = 4 bytes; Classful IP subnet |
| // Router = 4 bytes; IP address of router |
| |
| routes := []*types.Route{} |
| for len(opt) >= 8 { |
| sn := opt[0:4] |
| r := opt[4:8] |
| rt := &types.Route{ |
| Dst: classfulSubnet(sn), |
| GW: r, |
| } |
| routes = append(routes, rt) |
| opt = opt[8:] |
| } |
| |
| return routes |
| } |