PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ifconfig als System Call???



7.e.Q
03-07-2006, 14:06
Hi Leute,

da wir in unserer Software für die Simulation von Teilnehmern einen riesigen Haufen VETH Schnittstellen (eth0:1 - eth0:xxx) einrichten müssen und dies über den Aufruf von fork() -> exec('ifconfig') für jede Schnittstelle sehr lange dauert, dachte ich, man könnte dies eventuell beschleunigen, wenn man das, was ifconfig macht, per System Call direkt im Programm ausführen könnte.

Was macht denn ifconfig, um ein VETH einzurichten? Bzw. was muss man im eigenen Programm tun, um besagte VETH Schnittstelle einzurichten und zu aktivieren?

Danke

Gruß,
Hendrik

jeebee
03-07-2006, 15:08
Der Source-Code von ifconfig sollte darüber Auskunft geben.

7.e.Q
04-07-2006, 07:44
Ja, der macht irgendwelche ioctls... aber da steig ich noch nicht so ganz durch. Könnte da ein wenig Unterstützung gebrauchen, ein paar Denkanstöße.

anda_skoa
04-07-2006, 13:22
Vielleicht ist der Source des NetworkManager besser geeignet. D.h. in der Annahme, daß der nicht auch ifconfig aufruft.

Ciao,
_

7.e.Q
05-07-2006, 07:03
Hast du da evtl. 'nen Link zu dem Projekt? Ich google parallel dazu mal. :)

... ah, schon gefunden :)

... der scheint mit der libnl zu arbeiten, was bei unserer Software-Konstellation insofern nicht möglich ist, als daß wir keine neuen Bibliotheken hinzufügen können. Wir übersetzen unsere Software (den Teil, der die VETHs einrichten soll) unter Windows mit einer alt-eingesessenen Cygwin Umgebung (GCC 2.95). Diese Umgebung ist derart abgespeckt, daß mit ihr gerade noch die Übersetzung des besagten Software-Parts möglich ist. Alles andere wäre utopisch und mit massivem Mehraufwand verbunden...

Fazit: wir müssen uns auf die vorhandenen Bibliotheken beschränken - also die IOCTLs nutzen.

7.e.Q
05-07-2006, 15:43
Also für alle:

es sind nur wenige ioctls, die man machen muss, um ein ETH Interface einzurichten. Ich hab hier mal eine Funktion gebaut, die ein Interface einrichtet und hochfährt, und eine, die es wieder runterfährt. Hab mich bei ifconfig bedient, die Funktion set_flag übernommen.

einrichten & hochfahren:


int CreateInterface(std::string IFName, std::string IP, std::string NetMask)
{
struct ifreq my_veth;

int skfd = -1;

if( (skfd = socket(2,1,0) ) < 0)
{
perror("socket");
exit(1);
}

struct sockaddr_in if_addr;
struct sockaddr_in if_mask;

int iret = -1;

if_addr.sin_family = AF_INET;
if_addr.sin_addr.s_addr = inet_addr(IP.c_str());

if_mask.sin_family = AF_INET;
if_mask.sin_addr.s_addr = inet_addr(NetMask.c_str());

//my_veth.

sprintf(my_veth.ifr_name, IFName.c_str());
memcpy((char*) &my_veth.ifr_addr, (char*)&if_addr, sizeof(struct sockaddr));

errno = 0;

iret = ioctl(skfd, SIOCSIFADDR, &my_veth);
if(iret < 0)
{
std::cout << "ERROR: Creation of IF " << IFName << " failed: " << strerror(errno) << std::endl;
return -1;
}

memcpy((char*) &my_veth.ifr_netmask, (char*)&if_mask, sizeof(struct sockaddr));
errno = 0;

iret = ioctl(skfd, SIOCSIFNETMASK, &my_veth);
if(iret < 0)
{
std::cout << "ERROR: Setting Netmask of IF " << IFName << " failed: " << strerror(errno) << std::endl;
return -1;
}
close(skfd);

return set_flag(IFName.c_str(), (IFF_UP | IFF_RUNNING));;
}


runterfahren:


int DownInterface(std::string IFName)
{

return set_flag(IFName.c_str(), IFF_UP);
}


set_flag (leicht modifiziert, um Socket nach Aktivität wieder freizugeben):


static int set_flag(const char *ifname, short flag)
{
int skfd = -1;

if( (skfd = socket(2,1,0) ) < 0)
{
perror("socket");
exit(1);
}

struct ifreq ifr;

sprintf(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) {
fprintf(stderr, "%s: unknown interface: %s\n",
ifname, strerror(errno));
return (-1);
}
sprintf(ifr.ifr_name, ifname);
ifr.ifr_flags |= flag;
if (ioctl(skfd, SIOCSIFFLAGS, &ifr) < 0) {
perror("SIOCSIFFLAGS");
return -1;
}

close(skfd);

return (0);
}



btw: furchtbarer Code-Stil in ifconfig... Einrückung völlig für'n Eimer...

anda_skoa
06-07-2006, 14:49
Coole Sache!

Vielleicht in der Sektion für Tips&Tutorials stellen wenn du dafür Zeit hast.

Beim socket() Aufruf wären statt den Zahlen die jeweiligen Konstanten interessant :)

Ciao,
_

RHBaum
07-07-2006, 09:33
da wir hier grad beim wuenschen sind ^^

std::string in quasi globalen funktionen sind urks ^^
also entweder das std::string aus der schnittstelle raus (const char * fuer, dann ham auch die c programmer ihre freude mit), oder ne gescheite Klassenschnittstelle (dann fuehln sich die c++ programmierer wohler).

Nur als Hinweiss auffassen, falls du da mal ne Lib draus machen willst (mit der zaunslatte wink^^)

Ciao ...

7.e.Q
07-07-2006, 10:41
mmh... ja, hab die auch erstmal nur so proprietär für unsere Software hier zusammengestrickt. Für die lib werd ich die dann entsprechend den Wünschen hier aufbohren, wenn ich die Zeit dafür finde.

anda_skoa
07-07-2006, 14:23
std::string in quasi globalen funktionen sind urks ^^

Finde ich nicht, std::string ist die bevorzugte Weise Zeichenketten in C++ zu transportieren, auch als Parameter von Funktionen.

Allerdings besser als "const std::string&"

Ciao,
_

mcspam
07-07-2006, 14:43
Finde ich nicht, std::string ist die bevorzugte Weise Zeichenketten in C++ zu transportieren, auch als Parameter von Funktionen.
Full ACK


Allerdings besser als "const std::string&"
du meinst damit hoffentlich, dass hier ein "const std::string&" besser wäre, oder? ;)

anda_skoa
07-07-2006, 15:39
Ja, sorry, ich meinte "aber in der Form einer konstanten Referenz"

Ciao,
_

7.e.Q
11-07-2006, 10:40
Man wird alt wie'ne Kuh...

okay, werd mir das Konstrukt mal merken und solche Dinge in Zukunft mit konstanten Referenzen realisieren. :)

RHBaum
11-07-2006, 10:55
Finde ich nicht, std::string ist die bevorzugte Weise Zeichenketten in C++ zu transportieren

richtig, aber:
Globale funktionen ?

@anda_skoa
er soll sich einfach nur entscheiden ob c oder c++

er verwendet flache funktionen, gut, aber warum dann die C Programmierer ausschliessen, wo er doch nicht mal an anderer stelle ne abhaengigkeit an ne C++ lib hat. Wuerde der universelleren verwendung zu gute kommen.

Er mag C++ machen, kein thema, dann soll er aber auch keine flachen funktionen anbieten sondern die funktionen in fuer c++ programmierer besser verwendbare objekte pappen.

Wie gesagt fuer den ersten wurf, wenns funktioniert, oder nur er es verwendet isses durchaus ok. Wenn ers nur als codeschnipsel anbietet wo man sich das benoetigte rausziehen kann, auch. Aber vielleicht soll ja mal ne lib draus werden (der threadersteller iss nich der erste der danach fragt), dann wuerd ich auf sowas halt achten ^^ Das wollt ich nur damit sagen.

Ciao ...

anda_skoa
11-07-2006, 15:48
@anda_skoa
er soll sich einfach nur entscheiden ob c oder c++

Offentsichlich C++, sonst hätte er kein std::string ;)



Er mag C++ machen, kein thema, dann soll er aber auch keine flachen funktionen anbieten sondern die funktionen in fuer c++ programmierer besser verwendbare objekte pappen.

Funktionen in Klassen "zu pappen" ist nicht sehr sinnvoll. Es gibt auch im C++ Standard reine Funktionen, zum Beispiel getline(), die STL Standardalgorithmen, etc.

In diesem Falle wäre vielleicht eine Interface Handling Klasse besser als reine Funktionen, aber ich würde schon sagen, daß das von Fall zu Fall unterschiedlich ist.

Ciao,
_

RHBaum
12-07-2006, 10:26
aber ich würde schon sagen, daß das von Fall zu Fall unterschiedlich ist.
Ja klar, funktionen die ziemlich generisch sind, also kein richtigen context zu einem bestimmten object bilden, sondern mit vielen unterschiedlichen objekten arbeiten koennen, sollt man als einzelne funktion lassen. Nur dann auch in nem namespace verstecken ^^
und hier bietet sich ja nen object gradezu an ^^


Offentsichlich C++, sonst hätte er kein std::string
Ja, aber nur das er von der c++ seite kommt, muss ja nich zwangslaeufig heissen dass die c programmierer ausgeschlossen werden sollen ^^

denk mal grade die abfrage des interfaces ist grad fuer c programmierer , und programmierer von sprachen die c-Schnittsellen koennen, ebenfalls intressant.

Ciao ...

7.e.Q
12-07-2006, 13:03
Ja, ich hab da als ersten Versuch ein wenig meinen Stil vernachlässigt. Das stimmt wohl. Inzwischen hab ich das ganze in eine Klasse "gepappt". Wenn das Teil bereit ist, als LIB veröffentlicht zu werden, wird selbstverständlich auch der Sourcecode beigelegt... logisch. Ist ja OpenSource/GPL. :)

Es sollen aber vorher noch weitere Features hinein, wie zum Beispiel das Anlegen und Löschen von Routen, respektive Standard-Gateway.

Gibt's eigentlich irgendwo ein Wiki, wo man solche Informationen platzieren kann?

7.e.Q
08-08-2006, 13:11
Ich wollt nur mal einwerfen, daß ich die LIB nicht vergessen habe. Jedoch liegt zuviel anderer Kram an, der vorher erledigt werden will... wie das immer so ist...