IPv6 ifconfig Utility c/c++

Alpay94

Hectopat
Katılım
27 Eylül 2018
Mesajlar
8
Merhaba @Recep Baltaş,
C/c++ dillerine ne kadar hakimsiniz bilmiyorum size Twitter üzerinden ulaşmaya çalıştım, buraya yönlendirdiniz. Gömülü sistemler üzerine çalışmaktayım.
Benim yapmaya çalıştığım bir kod implementasyonu var. Qnx işletim sistemi üzerinde çalışan aslında ifconfig Utility sinin yaptığı işi C++ kodu ile yapmaya çalıştığım bir kod var. Qnx işletim sistemi driver olarak IO-PKT-V6-hc driverını kullanıyor IPv6 Stack'i için. Nxp ımx8 kartı üzerinde bu işlemi yapmak istiyorum. "fec0" adındaki bir interface e sahip Nxp'nin kartı. Bir vlan oluşturmaya çalışıp belli bir adres vermek istiyorum. Bunun için şöyle bir kod bloğum mevcut:

C++:
bool CNetworkManager::setIpv6Address(
 std::string interfaceName,
 std::string ipAddr,
 CNetworkManager::EInterfaceRequestType_t interfaceRequest.
)
{
 struct sockaddr_in6 sin6;
 int sockFd;
 std::string Ip;
 struct ifreq ifr;
 bool retStatus;
 ELinkStatus_t linkStatus;
 // char* syscall;
 memset(&ifr, 0x00, sizeof(ifr));
 memset(&sin6, 0x00, sizeof(sin6));
 retStatus = true;
 /// Check if the interface is valid.
 LOGD(&gNMLogContext,"setIpv6Address interfaceName ",interfaceName," len ",interfaceName.size());
 retStatus = isInterfaceValid(interfaceName);
 if(retStatus == true)
 {
 /// If valid ,check valid IP.
 sin6.sin6_family = AF_INET6;
 sin6.sin6_len = sizeof(sin6);
 if (inet_pton(AF_INET6,&ipAddr[0], &sin6.sin6_addr) == 0)
 {
 LOGD(&gNMLogContext, " Requested IPv6 address conversion to in_addr format failed, invalid adress! ", 865);
 retStatus = false;
 }
 else if(inet_pton(AF_INET6,&ipAddr[0], &sin6.sin6_addr) == 1)
 {
 if(retStatus == true)
 {
 //delete the ip address.
 /// Create socket for INET and update the address information.
 strcpy(ifr.ifr_name, &interfaceName[0]);
 memcpy(&ifr.ifr_addr, &sin6, sizeof(ifr.ifr_addr));
 /// create socket.
 sockFd = socket(AF_INET6, SOCK_DGRAM, 0);
 const char * iName = interfaceName.c_str();
 printf("interface name : %s\n", iName);
 fflush(stdout);
 unsigned int outif = if_nametoindex(iName);
 int rc = setsockopt(sockFd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &outif, sizeof(outif));
 if(rc == -1){
 printf("setsockopt err: ", strerror(errno));
 fflush(stdout);
 }
 LOGD(&gNMLogContext, "Socket return ", sockFd);
 if (sockFd != -1)
 {
 /// Set IP address using SIOCSIFADDR ioctl flag.
 if (ioctl(sockFd, SIOCSIFADDR, &ifr6) != -1)
 {
 currentInterfaceConfig[interfaceName].mIpAddress = ipAddr;
 /// Set Interface Up/Down as per the request.
 /// Get ifreq.flags
 ioctl(sockFd, SIOCGIFFLAGS, &ifr6);

 if(interfaceRequest == CNetworkManager::EInterfaceRequestType_t::EInterfaceRequestType_SetLinkUp)
 {
 ifr6.ifr_ifru.ifru_flags6 |= (IFF_UP| IFF_RUNNING);
 linkStatus = ELinkStatus_Up;
 }
 else.
 {
 ifr.ifr_flags &= ~IFF_UP;
 linkStatus = ELinkStatus_Down;
 }

 if(ioctl(sockFd, SIOCSIFFLAGS, &ifr6) == -1)
 {
 LOGD(&gNMLogContext, "Interface link status change failed");
 retStatus = false;
 }
 else.
 {
 currentInterfaceConfig[interfaceName].mLinkStatus = linkStatus;
 }
 }
 else.
 {
 LOGD(&gNMLogContext, "Setting IPV6 address failed ");
 printf("ioctl inet6 address set errno: %s\n", strerror(errno));
 fflush(stdout); // Will now print everything in the stdout buffer.
 retStatus = false;
 }
 }
 else.
 {
 LOGD(&gNMLogContext, "Socket creation failed ");
 retStatus = false;
 }
 close (sockFd);
 }
 }
 }
 else.
 {
 LOGD(&gNMLogContext, "Invalid interface ",interfaceName);
 retStatus = false;
 }
 return retStatus;
}

Bildiğim kadarıyla ifconfig Utility'si Linux vb işletim sistemlerinde ioctl fonksiyonu üzerinden adres, netmask, broadcast adresi gibi adreslerin ayarlanmasını sağlamakta.
Kodun çıktısı olarak bu şekilde bir geri dönüş almaktayım: "ioctl inet6 address set errno: Operation not supported". İşletim sistemi tarafından bu şekilde bir error set edilmiş durumda.
Konu hakkında fikriniz var mıdır acaba? Ya da bilgisi olabilecek bir tanıdığınız?
 

Dosya Ekleri

  • 1662126369443.png
    1662126369443.png
    47,6 KB · Görüntüleme: 39
Konuyu programlama kategorisine açmalıydınız. Buradan doğru kişilere ulaşmanız çok zor. :)

 

Bu konuyu görüntüleyen kullanıcılar

Technopat Haberler

Yeni konular

Geri
Yukarı