11package client
22
33import (
4+ "net"
45 "path/filepath"
56
67 "github.com/sirupsen/logrus"
78
89 "github.com/longhorn/go-spdk-helper/pkg/jsonrpc"
910
1011 spdktypes "github.com/longhorn/go-spdk-helper/pkg/spdk/types"
12+ spdkutil "github.com/longhorn/go-spdk-helper/pkg/util"
1113)
1214
1315// AddDevice adds a device with the given device path, name, and cluster size.
@@ -55,8 +57,30 @@ func (c *Client) DeleteDevice(bdevAioName, lvsName string) (err error) {
5557 return nil
5658}
5759
60+ // DetectAddressFamily returns the NVMe address family for the given IP.
61+ // Exported so downstream repos (longhorn-spdk-engine) can reuse it.
62+ func DetectAddressFamily (ip string ) spdktypes.NvmeAddressFamily {
63+ if ip == "" {
64+ return spdktypes .NvmeAddressFamilyIPv4
65+ }
66+
67+ normalized := spdkutil .NormalizeNvmeAddr (ip )
68+ parsedIP := net .ParseIP (normalized )
69+ if parsedIP == nil {
70+ logrus .Warnf ("Failed to parse IP %q, defaulting to IPv4" , ip )
71+ return spdktypes .NvmeAddressFamilyIPv4
72+ }
73+
74+ if parsedIP .To4 () == nil {
75+ return spdktypes .NvmeAddressFamilyIPv6
76+ }
77+ return spdktypes .NvmeAddressFamilyIPv4
78+ }
79+
5880// StartExposeBdev exposes the bdev with the given nqn, bdevName, nguid, ip, and port.
5981func (c * Client ) StartExposeBdev (nqn , bdevName , nguid , ip , port string ) error {
82+ ip = spdkutil .NormalizeNvmeAddr (ip )
83+
6084 logrus .Infof ("Exposing bdev with nqn %v, bdevName %v, nguid %v, ip %v, port %v" , nqn , bdevName , nguid , ip , port )
6185
6286 nvmfTransportList , err := c .NvmfGetTransports ("" , "" )
@@ -80,8 +104,10 @@ func (c *Client) StartExposeBdev(nqn, bdevName, nguid, ip, port string) error {
80104 return err
81105 }
82106
83- logrus .Infof ("Adding listener with transport address %v, transport service id %v, transport type %v, address family %v to subsystem with nqn %v" , ip , port , spdktypes .NvmeTransportTypeTCP , spdktypes .NvmeAddressFamilyIPv4 , nqn )
84- if _ , err := c .NvmfSubsystemAddListener (nqn , ip , port , spdktypes .NvmeTransportTypeTCP , spdktypes .NvmeAddressFamilyIPv4 ); err != nil {
107+ adrfam := DetectAddressFamily (ip )
108+
109+ logrus .Infof ("Adding listener with transport address %v, transport service id %v, transport type %v, address family %v to subsystem with nqn %v" , ip , port , spdktypes .NvmeTransportTypeTCP , adrfam , nqn )
110+ if _ , err := c .NvmfSubsystemAddListener (nqn , ip , port , spdktypes .NvmeTransportTypeTCP , adrfam ); err != nil {
85111 return err
86112 }
87113
@@ -95,6 +121,8 @@ func (c *Client) StartExposeBdev(nqn, bdevName, nguid, ip, port string) error {
95121// a unique controller-ID range per engine to avoid "Duplicate cntlid" errors
96122// when multiple targets share one subsystem NQN. Pass 0 for defaults.
97123func (c * Client ) StartExposeBdevWithANAState (nqn , bdevName , nguid , nsUUID , ip , port string , anaState spdktypes.NvmfSubsystemListenerAnaState , minCntlid , maxCntlid uint16 ) error {
124+ ip = spdkutil .NormalizeNvmeAddr (ip )
125+
98126 logrus .Infof ("Exposing bdev with nqn %v, bdevName %v, nguid %v, nsUUID %v, ip %v, port %v, anaState %v, minCntlid %v, maxCntlid %v" ,
99127 nqn , bdevName , nguid , nsUUID , ip , port , anaState , minCntlid , maxCntlid )
100128
@@ -119,14 +147,16 @@ func (c *Client) StartExposeBdevWithANAState(nqn, bdevName, nguid, nsUUID, ip, p
119147 return err
120148 }
121149
122- logrus .Infof ("Adding listener with transport address %v, transport service id %v, transport type %v, address family %v to subsystem with nqn %v" , ip , port , spdktypes .NvmeTransportTypeTCP , spdktypes .NvmeAddressFamilyIPv4 , nqn )
123- if _ , err := c .NvmfSubsystemAddListener (nqn , ip , port , spdktypes .NvmeTransportTypeTCP , spdktypes .NvmeAddressFamilyIPv4 ); err != nil {
150+ adrfam := DetectAddressFamily (ip )
151+
152+ logrus .Infof ("Adding listener with transport address %v, transport service id %v, transport type %v, address family %v to subsystem with nqn %v" , ip , port , spdktypes .NvmeTransportTypeTCP , adrfam , nqn )
153+ if _ , err := c .NvmfSubsystemAddListener (nqn , ip , port , spdktypes .NvmeTransportTypeTCP , adrfam ); err != nil {
124154 return err
125155 }
126156
127157 logrus .Infof ("Setting listener ANA state to %v for subsystem with nqn %v" , anaState , nqn )
128158 if _ , err := c .NvmfSubsystemListenerSetANAState (nqn , ip , port , spdktypes .NvmeTransportTypeTCP ,
129- spdktypes . NvmeAddressFamilyIPv4 , anaState , spdktypes .DefaultNvmfANAGroupID ); err != nil {
159+ adrfam , anaState , spdktypes .DefaultNvmfANAGroupID ); err != nil {
130160 return err
131161 }
132162
0 commit comments