DWORD InterfaceUtils::InterfaceAddIPAddress(const char * requestAddrString, const char * requestMaskString, DWORD interfaceIndex, PULONG pNTEContext) { //BEGIN --add ip to interface DWORD ret; ULONG NTEInstance = 0; if ((ret = AddIPAddress(inet_addr(requestAddrString), inet_addr(requestMaskString), interfaceIndex, pNTEContext, &NTEInstance)) == NO_ERROR) { return NO_ERROR; } else { switch (ret) { case ERROR_DEV_NOT_EXIST: printf(" (ERROR_DEV_NOT_EXIST)\n"); break; case ERROR_DUP_DOMAINNAME: printf(" (ERROR_DUP_DOMAINNAME)\n"); break; case ERROR_GEN_FAILURE: printf(" (ERROR_GEN_FAILURE)\n"); break; case ERROR_INVALID_HANDLE: printf(" (ERROR_INVALID_HANDLE)\n"); break; case ERROR_INVALID_PARAMETER: printf(" (ERROR_INVALID_PARAMETER)\n"); break; case ERROR_NOT_SUPPORTED: printf(" (ERROR_NOT_SUPPORTED)\n"); break; default: printf("\n"); break; } } return -1; //END --add ip to interface }
int intf_set(intf_t *intf, const struct intf_entry *entry) { /* * XXX - could set interface up/down via SetIfEntry(), * but what about the rest of the configuration? :-( * {Add,Delete}IPAddress for 2000/XP only */ #if 0 /* Set interface address. XXX - 2000/XP only? */ if (entry->intf_addr.addr_type == ADDR_TYPE_IP) { ULONG ctx = 0, inst = 0; UINT ip, mask; memcpy(&ip, &entry->intf_addr.addr_ip, IP_ADDR_LEN); addr_btom(entry->intf_addr.addr_bits, &mask, IP_ADDR_LEN); if (AddIPAddress(ip, mask, _find_ifindex(intf, entry->intf_name), &ctx, &inst) != NO_ERROR) { return (-1); } return (0); } #endif errno = ENOSYS; SetLastError(ERROR_NOT_SUPPORTED); return (-1); }
DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { NTSTATUS Status; COMM_DHCP_REPLY Reply; PDHCP_ADAPTER Adapter; struct protocol* proto; ApiLock(); Adapter = AdapterFindIndex( Req->AdapterIndex ); Reply.Reply = Adapter ? 1 : 0; if( Adapter ) { if (Adapter->NteContext) { DeleteIPAddress( Adapter->NteContext ); Adapter->NteContext = 0; } if (Adapter->RouterMib.dwForwardNextHop) { DeleteIpForwardEntry( &Adapter->RouterMib ); Adapter->RouterMib.dwForwardNextHop = 0; } Adapter->DhclientState.state = S_STATIC; proto = find_protocol_by_adapter( &Adapter->DhclientInfo ); if (proto) remove_protocol(proto); Status = AddIPAddress( Req->Body.StaticRefreshParams.IPAddress, Req->Body.StaticRefreshParams.Netmask, Req->AdapterIndex, &Adapter->NteContext, &Adapter->NteInstance ); Reply.Reply = NT_SUCCESS(Status); if (AdapterStateChangedEvent != NULL) SetEvent(AdapterStateChangedEvent); } ApiUnlock(); return Send( &Reply ); }
/** * Set device IP address * @param ip New IP address * @return -1 if it failed, 0 on success */ static int ti_set_ip_cygwin(struct tif *ti, struct in_addr *ip) { struct tip_cygwin *priv = ti_priv(ti); ULONG ctx, inst; IP_ADAPTER_INFO ai[16]; DWORD len = sizeof(ai); PIP_ADAPTER_INFO p; PIP_ADDR_STRING ips; if (GetAdaptersInfo(ai, &len) != ERROR_SUCCESS) return -1; p = ai; while (p) { if (strcmp(priv->tc_guid, p->AdapterName) != 0) { p = p->Next; continue; } /* delete ips */ ips = &p->IpAddressList; while (ips) { DeleteIPAddress(ips->Context); ips = ips->Next; } /* add ip */ if (AddIPAddress(ip->s_addr, htonl(0xffffff00), p->Index, &ctx, &inst) != NO_ERROR) return -1; break; } return 0; }
void main(int argc, char *argv[]) { ULONG NTEContext = 0; ULONG NTEInstance; IPAddr NewIP; IPAddr NewMask; DWORD Index; DWORD Context; CHAR NewIPStr[IPADDR_BUF_SIZE]; CHAR NewMaskStr[IPADDR_BUF_SIZE]; PIP_ADAPTER_INFO pAdapterInfo, pAdapt; PIP_ADDR_STRING pAddrStr; DWORD AdapterInfoSize; DWORD Err; BOOL OptList = FALSE; BOOL OptAdd = FALSE; BOOL OptDel = FALSE; NewIPStr[0] = '\0'; NewMaskStr[0] = '\0'; Context = Index = (DWORD)-1; for (int i = 1; i < argc; i++) { if ((argv[i][0] == '-') || (argv[i][0] == '/')) { switch(tolower(argv[i][1])) { case 'l': OptList = TRUE; break; case 'a': OptAdd = TRUE; break; case 'c': if (strlen(argv[i]) > 2) Context = atoi(&argv[i][2]); break; case 'd': OptDel = TRUE; break; case 'i': if (strlen(argv[i]) > 2) strcpy_s(NewIPStr, IPADDR_BUF_SIZE, &argv[i][2]); break; case 'm': if (strlen(argv[i]) > 2) strcpy_s(NewMaskStr, IPADDR_BUF_SIZE, &argv[i][2]); break; case 'n': if (strlen(argv[i]) > 2) Index = atoi(&argv[i][2]); break; default: printf("default\n"); Usage(); return; } } else { printf("else\n"); Usage(); return; } } // Check options if ((OptAdd && (Index == -1 || NewIPStr[0] == '\0' || NewMaskStr[0] == '\0')) || (OptDel && Context == -1)) { Usage(); return; } // Get sizing information about all adapters AdapterInfoSize = 0; if ((Err = GetAdaptersInfo(NULL, &AdapterInfoSize)) != 0) { if (Err != ERROR_BUFFER_OVERFLOW) { printf("GetAdaptersInfo sizing failed with error %d\n", Err); return; } } // Allocate memory from sizing information if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL) { printf("Memory allocation error\n"); return; } // Get actual adapter information if ((Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0) { printf("GetAdaptersInfo failed with error %d\n", Err); return; } if (OptList) { printf("MAC Address - Adapter\n" "Index Context Ip Address Subnet Mask\n" "--------------------------------------------------------------\n"); pAdapt = pAdapterInfo; while (pAdapt) { for (UINT i=0; i<pAdapt->AddressLength; i++) { if (i == (pAdapt->AddressLength - 1)) printf("%.2X - ",(int)pAdapt->Address[i]); else printf("%.2X-",(int)pAdapt->Address[i]); } printf("%s\n", pAdapt->Description); pAddrStr = &(pAdapt->IpAddressList); while(pAddrStr) { printf("%-10.d%-10.d%-20.20s%s\n", pAdapt->Index, pAddrStr->Context, pAddrStr->IpAddress.String, pAddrStr->IpMask.String); pAddrStr = pAddrStr->Next; } pAdapt = pAdapt->Next; } } if (OptAdd) { NewIP = inet_addr(NewIPStr); NewMask = inet_addr(NewMaskStr); if ((Err = AddIPAddress(NewIP, NewMask, Index, &NTEContext, &NTEInstance)) != 0) { printf("AddIPAddress failed with error %d, %d\n", NTEContext, Err); return; } } if (OptDel) { if ((Err = DeleteIPAddress(Context)) != 0) printf("DeleteIPAddress failed %d\n", Err); } }
bool Win32Vif::FindIPAddr(ProtoAddress vifAddr) { // Iterate through addresses looking for an address match ULONG bufferSize = 0; ULONG index = 0; if (ERROR_INSUFFICIENT_BUFFER == GetIpAddrTable(NULL, &bufferSize, FALSE)) { char* tableBuffer = new char[bufferSize]; if (NULL == tableBuffer) { PLOG(PL_ERROR, "ProtoSocket::GetInterfaceName() new tableBuffer error: %s\n", ::GetErrorString()); return false; } MIB_IPADDRTABLE* addrTable = (MIB_IPADDRTABLE*)tableBuffer; if (ERROR_SUCCESS == GetIpAddrTable(addrTable, &bufferSize, FALSE)) { for (DWORD i = 0; i < addrTable->dwNumEntries; i++) { MIB_IPADDRROW* entry = &(addrTable->table[i]); ProtoAddress tempAddress; tempAddress.SetRawHostAddress(ProtoAddress::IPv4, (char*)&entry->dwAddr, 4); if (tempAddress.HostIsEqual(vifAddr)) { return true; // ljt fix me MIB_IFROW ifEntry; index = entry->dwIndex; if (NO_ERROR != GetIfEntry(&ifEntry)) { PLOG(PL_ERROR, "ProtoSocket::GetInterfaceName() GetIfEntry(%d) error: %s\n", i, ::GetErrorString()); return false; } delete[] tableBuffer; break; } } } else { PLOG(PL_WARN, "ProtoSocket::GetInterfaceName(%s) warning GetIpAddrTable() error: %s\n", vifAddr.GetHostString(), GetErrorString()); } delete[] tableBuffer; } if (index) { // we found one - add another address // ljt need to check if this is a vif etc // maybe don't do this at all? just fail // if we've found one? ULONG status = TRUE; UINT tmpIPAddr; UINT tmpIPMask; ULONG NTEContext = 0; ULONG NTEInstance = 0; tmpIPAddr = inet_addr(vifAddr.GetHostString()); tmpIPMask = inet_addr("255.255.255.0"); if ((status = AddIPAddress(tmpIPAddr, tmpIPMask, index, &NTEContext, &NTEInstance)) != NO_ERROR) { PLOG(PL_ERROR,"Win32Vif::Open() AddIPAddress call failed with %d\n",status); return false; } return true; } return false; } // end Win32Vif::FindIPAddr()