2016-08-07 46 views
0

erhalten ist es möglich, Socket ID im Linux-Kernel in sk_buff struct zu erhalten? Ich weiß, ich socket mit diesem Code bekommen konnte:Socket-ID des Sockets in sk_buff

const struct tcphdr *th = tcp_hdr(skb); 
struct sock *sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest); 
if (sk) 
    struct socket* = sk->sk_socket; 

Wo könnte ich ID und was Maximalwert dieser ID finden?

Antwort

0

Ein Socket ist eine Datei.

Sie finden innerhalb des struct socket ein struct file *file Mitglied.

Ich empfehle Ihnen look at this question, speziell die Verbindung "things you never should do in the Kernel" auf die angenommene Antwort, weil ich mir Sorgen mache über den Grund, warum Sie versuchen, den Dateideskriptor aus einer Socket-Struktur im Kernel (in der Regel möchten Sie mach das genaue Gegenteil).

Um den Dateideskriptor von einer bestimmten Datei unter dem Kernel abzurufen, müssen Sie die fdtable (Suche nach files_fdtable()) iterieren ... das ist eine enorme Menge an Arbeit zu tun, vor allem, wenn es eine riesige Menge ist von offenen Dateien.

Der Maximalwert für einen Wert Dateideskriptor wird die maximale Anzahl von Dateien im System erlaubt sein, und kann mit so etwas wie abgerufen wird:

files_fdtable(current->files)->max_fds; 
+0

Hallo, danke für Sie beantworten. Ich brauche einige König der Verbindungs-ID, weil ich statische Array mit Zeigern zu meinen Daten für jede Verbindung erstellen muss. Als ich in usermode war (hooking 'send',' write' usw.) habe ich ein statisches Array mit der Größe 'array [65536]' erstellt, weil der Socket-Deskriptor 'short' ist und wenn ich zum Beispiel Daten von diesem Array holen muss in 'send' Funktion benutzte ich' array [fd] '- es ist sehr schnell und sicher und jetzt suche ich nach einer Alternative für mein Kernel Netfilter Modul – Kracken

+0

Beachten Sie, dass' socket() 'ein' int' zurückgibt (nicht ein '' kurz ") und Sie sollten keine Annahmen hinsichtlich seiner Größe treffen, ohne seine Größe effektiv zu überprüfen. Auf meinem System, auf dem ich diesen Kommentar schreibe, ist ein "int" 32 Bit lang, was bedeutet, dass Ihr Array als int Array [2147483648] deklariert sein sollte, was offensichtlich einen Stapelüberlauf verursacht, weil Sie es versuchen würden ordne 8GiB auf dem Stapel zu. Mein Punkt ist, dass Sie wahrscheinlich Ihren Ansatz ändern möchten. Ich empfehle Ihnen, den netfilter modules code im 'net/netfilter /' -Verzeichnis zu überprüfen und zu prüfen, wie diese Situationen wie Ihre behandeln könnten. – pah

+0

Hallo, ich fand eine Sache, es ist 'sk_buff-> sock-> sk_user_data', ich könnte hier Zeiger auf meine Daten einfügen, aber es gibt ein Problem, auf der Serverseite (wo ich meinen Treiber laden) verbindet sich jeder Client-Verbindungen Ein Server-Port und 'sk_buff-> sock' ist für jede Client-Verbindung gleich, vielleicht weißt du, wo ich' custom data' für jede Verbindung finde, wo ich Zeiger auf meine Daten einfügen kann? – Kracken