SUBMAKE = $(MAKE) --no-print-directory
USRLIBS := crt0.o acess.ld ld-acess.so libacess.so libgcc.so libc.so libnet.so
-USRAPPS := init login CLIShell cat ls mount ifconfig
+USRAPPS := init login CLIShell cat ls mount
+USRAPPS += ifconfig ping
ALL_DYNMODS = $(addprefix all-,$(DYNMODS))
ALL_MODULES := $(addprefix all-,$(MODULES))
int lastID;
int i;
struct sArpRequest4 req;
+ Sint64 timeout;
ENTER("pInterface xAddress", Interface, Address);
// Send Request
Link_SendPacket(Interface->Adapter, 0x0806, req.DestMac, sizeof(struct sArpRequest4), &req);
+ timeout = now() + Interface->TimeoutDelay;
+
// Wait for a reply
for(;;)
{
- while(lastID == giARP_LastUpdateID) Threads_Yield();
+ while(lastID == giARP_LastUpdateID && now() < timeout)
+ Threads_Yield();
+
+ if( now() >= timeout ) break; // Timeout
+
lastID = giARP_LastUpdateID;
Mutex_Acquire( &glARP_Cache4 );
}
Mutex_Release( &glARP_Cache4 );
}
+ {
+ tMacAddr ret = {{0,0,0,0,0,0}};
+ return ret;
+ }
}
/**
if( CheckBits < 0 ) CheckBits = 0;
if( CheckBits > size*8 ) CheckBits = size*8;
- if( CheckBits == 0 ) return 1; // /0 matches anythin
+ if( CheckBits == 0 ) return 1; // /0 matches anythin0
// Check first bits/8 bytes
if( memcmp(Address1, Address2, CheckBits/8) != 0 ) return 0;
* Acess2 IP Stack
* - Routing Tables
*/
-#define DEBUG 0
+#define DEBUG 1
#define VERSION VER2(0,10)
#include <acess.h>
#include <tpl_drv_common.h>
if( !CheckMem(Data, sizeof(int) + IPStack_GetAddressSize(data->Type)) )
LEAVE_RET('i', -1);
- Log_Debug("IPStack", "Route_RouteDir_IOCtl - FindRoute %i, %s\n",
+ Log_Debug("IPStack", "Route_RouteDir_IOCtl - FindRoute %i, %s",
data->Type, IPStack_PrintAddress(data->Type, data->Addr) );
rt = IPStack_FindRoute(data->Type, NULL, data->Addr);
gIP_Routes = gIP_RoutesEnd = rt;
}
- Log_Log("IPStack", "Route entry for '%s' created\n", InterfaceName);
+ Log_Log("IPStack", "Route entry for '%s' created", InterfaceName);
return rt->Node.Inode;
}
int tmp, fd;
char path[sizeof(IPSTACK_ROOT)+1+4+1]; // /0000
uint8_t addr[4] = {10,0,2,55};
- uint8_t gw[4] = {10,0,2,1};
- int subnet = 8;
+ uint8_t gw[4] = {10,0,2,2};
+ int subnet = 24;
tmp = AddInterface(Device);
if( tmp < 0 ) return tmp;
// Set routes
{
uint8_t net[4] = {0,0,0,0};
- AddRoute(path + sizeof(IPSTACK_ROOT), addr, 8, net); // This interface
+ AddRoute(path + sizeof(IPSTACK_ROOT), addr, subnet, net); // This interface
AddRoute(path + sizeof(IPSTACK_ROOT), net, 0, gw); // Gateway
}
-include ../Makefile.cfg
+LDFLAGS += -lnet
+
OBJ = main.o
BIN = ../ping
#include <stdio.h>
#include <string.h>
#include <acess/sys.h>
+#include <net.h>
// === CONSTANTS ===
#define IPSTACK_ROOT "/Devices/ip"
void PrintHelp(char *ProgName);
int GetAddress( char *Address, uint8_t *Addr );
+// === GLOBALS ===
+ int giNumberOfPings = 1;
+
// === CODE ===
/**
* \fn int main(int argc, char *argv[])
int i, j;
uint8_t addr[16];
int type;
+
+ int fd, call, ping;
for(i = 1; i < argc; i++)
{
}
// Read Address
- type = GetAddress(ipStr, addr);
+ type = Net_ParseAddress(ipStr, addr);
if( type == 0 ) {
fprintf(stderr, "Invalid IP Address\n");
return 1;
if( !iface )
{
- fprintf(stderr, "WARNING: \"All interfaces\" is currently uniplemented");
- return 2;
+ iface = Net_GetInterface(type, addr);
+ if( !iface ) {
+ fprintf(stderr, "Unable to find a route to '%s'\n",
+ Net_PrintAddress(type, addr)
+ );
+ return -1;
+ }
+
+ printf("iface = '%s'\n", iface);
}
- else
+
{
- int fd = open(iface, OPENFLAG_EXEC);
- int call, ping;
- if(fd == -1) {
- fprintf(stderr, "ERROR: Unable to open interface '%s'\n", iface);
- return 1;
- }
+ char *_iface = malloc( sizeof("/Devices/ip/") + strlen(iface) + 1 );
+ strcpy(_iface, "/Devices/ip/");
+ strcat(_iface, iface);
+ free(iface); // TODO: Handle when this is not heap
+ iface = _iface;
+ printf("iface = '%s'\n", iface);
+ }
+
+ fd = open(iface, OPENFLAG_EXEC);
+ if(fd == -1) {
+ fprintf(stderr, "ERROR: Unable to open interface '%s'\n", iface);
+ return 1;
+ }
- call = ioctl(fd, 3, "ping");
- if(call == 0) {
- fprintf(stderr, "ERROR: '%s' does not have a 'ping' call\n", iface);
- return 1;
- }
+ call = ioctl(fd, 3, "ping");
+ if(call == 0) {
+ fprintf(stderr, "ERROR: '%s' does not have a 'ping' call\n", iface);
+ return 1;
+ }
+
+ for( i = 0; i < giNumberOfPings; i ++ )
+ {
ping = ioctl(fd, call, addr);
- printf("ping = %i\n");
-
- close(fd);
+ printf("ping = %i\n", ping);
}
+
+ close(fd);
return 0;
}