I tried to plumb an IP address on an IPMP interface using the below sample code, the interface gets plumbed correctly (correct output in ifconfig -a). But running just the "ipadm" command does not show the plumbed interface and the running "ipadm show-addr" shows a '/?' in the description.
Seeing this behaviour on Solaris 11.1 and Solaris 11.2
#ipadm show-addr
ADDROBJ TYPE STATE ADDR
lo0/v4 static ok 127.0.0.1/8
ipmp0/? static ok X.X.X.X
lo0/v6 static ok ::1/128
// Code
int main(){
int sd;
//struct sockaddr *addr;
struct sockaddr_in *addr;
struct lifreq lifr;
const char *aliasName;
memset(&lifr, 0, sizeof(lifr));
const char* networkInterfaceName = "ipmp0";
// Here the actual address is written. Hiding here :)
const char *inetAddress = "10.XX.XX.XX";
const char *netmaskAddress = "255.255.252.0";
strncpy(lifr.lifr_name, networkInterfaceName, sizeof(lifr.lifr_name));
// Create socket
if((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
cout << "Error Socket Creation" << endl ;
}
// Add interface name
if(ioctl(sd, SIOCLIFADDIF, &lifr) < 0){
perror ("SIOCLIFADDIF");
cout << "Error ioctl SIOCLIFADDIF" << endl ;
}
// Defines the netmask
addr = (struct sockaddr_in*) &(lifr.lifr_addr);
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr(netmaskAddress);
if(ioctl(sd, SIOCSLIFNETMASK, &lifr) < 0){
perror("SIOCSLIFNETMASK");
cout << "Error ioctl SIOCSLIFNETMASK" << endl;
}
// Set up the new interface
// Defines the address of the new interface.
addr->sin_addr.s_addr = inet_addr(inetAddress);
if(ioctl(sd, SIOCSLIFADDR, &lifr) < 0){
perror ("SIOCLIFADDR");
cout << "Error ioctl SIOCLIFADDR" << endl ;
}
if(ioctl(sd, SIOCGLIFFLAGS, &lifr)< 0){
perror("SIOCGLIFFLAGS");
cout << "Error ioctl SIOCGLIFFLAGS" << endl;
}
lifr.lifr_flags |= IFF_UP;
if(ioctl(sd, SIOCSLIFFLAGS, &lifr) < 0){
perror("SIOCSLIFFLAGS");
cout << "Error ioctl SIOCSLIFFLAGS" << endl;
}
close(sd);
return 0;
}
What is the bug in my sample code?