88 "os"
99 "strings"
1010
11+ "github.com/insomniacslk/dhcp/iana"
1112 "github.com/ironcore-dev/fedhcp/internal/api"
1213
1314 "gopkg.in/yaml.v2"
@@ -29,7 +30,7 @@ var _ = Describe("Endpoint", func() {
2930 ns := SetupTest ()
3031
3132 BeforeEach (func (ctx SpecContext ) {
32- By ("Creating an IPAM IP objects" )
33+ By ("Creating IPAM IP objects" )
3334 mac := machineWithIPAddressMACAddress
3435 m , err := net .ParseMAC (mac )
3536 Expect (err ).NotTo (HaveOccurred ())
@@ -356,6 +357,35 @@ var _ = Describe("Endpoint", func() {
356357 Eventually (Get (endpoint )).Should (Satisfy (apierrors .IsNotFound ))
357358 })
358359
360+ It ("Should create an endpoint for IPv6 DHCP request from a unknown machine, if ClientLinkLayer is set to allowed MAC (RFC6939) " , func (ctx SpecContext ) {
361+ mac , _ := net .ParseMAC (unknownMachineMACAddress )
362+ ip := net .ParseIP (linkLocalIPV6Prefix )
363+ linkLocalIPV6Addr , _ := eui64 .ParseMAC (ip , mac )
364+
365+ req , _ := dhcpv6 .NewMessage ()
366+ req .MessageType = dhcpv6 .MessageTypeRequest
367+ relayedRequest , _ := dhcpv6 .EncapsulateRelay (req , dhcpv6 .MessageTypeRelayForward , net .IPv6loopback , linkLocalIPV6Addr )
368+
369+ knownMac , _ := net .ParseMAC (machineWithIPAddressMACAddress )
370+ relayedRequest .AddOption (dhcpv6 .OptClientLinkLayerAddress (iana .HWTypeEthernet , knownMac ))
371+
372+ stub , _ := dhcpv6 .NewMessage ()
373+ stub .MessageType = dhcpv6 .MessageTypeReply
374+ _ , _ = handler6 (relayedRequest , stub )
375+
376+ endpoint := & metalv1alpha1.Endpoint {
377+ ObjectMeta : metav1.ObjectMeta {
378+ Name : machineWithIPAddressName ,
379+ },
380+ }
381+
382+ knownLinkLocalIPV6Addr , _ := eui64 .ParseMAC (ip , knownMac )
383+ Eventually (Object (endpoint )).Should (SatisfyAll (
384+ HaveField ("Spec.MACAddress" , machineWithIPAddressMACAddress ),
385+ HaveField ("Spec.IP" , metalv1alpha1 .MustParseIP (knownLinkLocalIPV6Addr .String ()))))
386+ DeferCleanup (k8sClient .Delete , endpoint )
387+ })
388+
359389 It ("Should return and break plugin chain, if getting an IPv6 DHCP request directly (no relay)" , func (ctx SpecContext ) {
360390 req , _ := dhcpv6 .NewMessage ()
361391 req .MessageType = dhcpv6 .MessageTypeRequest
0 commit comments