2009-02-25 20 views
10

से आईपी पता मैं एक कर्नेल मॉड्यूल लिख रहा हूं जो नेटफिल्टर हुक पंजीकृत करता है। मैं sk_buff-> saddr सदस्य का उपयोग कर कॉलर का आईपी पता प्राप्त करने की कोशिश कर रहा हूं। क्या कोई तरीका है कि मैं मानव पठनीय i.e. x.x.x.x प्रारूप में आईपी प्राप्त कर सकता हूं?sk_buff

मुझे फ़ंक्शन inet_ntop() मिला लेकिन यह कर्नेल हेडर में उपलब्ध प्रतीत नहीं होता है। मैं \ xC0 \ xA8 \ x00 \ x01 से 192.168.0.1 को कैसे परिवर्तित करूं?

+0

inet_ntop() और इसके भाई inet_pton() वास्तव में arpa/inet.h में हैं, मैं अब कर्नेल कार्यान्वयन की तलाश में हूं। –

+0

ummm, netfilter के लॉग लक्ष्य को यह करना होगा ... मैं वहां देखता हूं। – derobert

+0

और रोहित: ईमानदार होने के लिए, यदि आप नहीं जानते कि इस तरह की स्ट्रिंग में बाइट्स को कैसे प्रारूपित किया जाए, तो आपको शायद कर्नेल मॉड्यूल नहीं लिखना चाहिए। पहले कुछ उपयोगकर्ता स्पेस सामान आज़माएं। –

उत्तर

12

वहाँ दो मैक्रो में परिभाषित शामिल हैं/linux/kernel.h

IPv4 पतों और NIP6 IPv6 पतों के लिए के लिए

NIPQUAD।

#define NIPQUAD(addr) \ 
    ((unsigned char *)&addr)[0], \ 
    ((unsigned char *)&addr)[1], \ 
    ((unsigned char *)&addr)[2], \ 
    ((unsigned char *)&addr)[3] 

#define NIP6(addr) \ 
    ntohs((addr).s6_addr16[0]), \ 
    ntohs((addr).s6_addr16[1]), \ 
    ntohs((addr).s6_addr16[2]), \ 
    ntohs((addr).s6_addr16[3]), \ 
    ntohs((addr).s6_addr16[4]), \ 
    ntohs((addr).s6_addr16[5]), \ 
    ntohs((addr).s6_addr16[6]), \ 
    ntohs((addr).s6_addr16[7]) 

कर्नेल के सूत्रों है कि इन के उपयोग मानव पठनीय प्रारूप में आईपी पतों मुद्रित करने के लिए बनाने के में पर्याप्त उदाहरण हैं। उदाहरण के लिए:

printk(KERN_DEBUG "Received packet from source address: %d.%d.%d.%d!\n",NIPQUAD(iph->saddr)); 

आशा है कि इससे मदद मिलती है।

+9

को क्रैश कर दिया, अब मैं इस पर दौड़ गया। दूसरों के लाभ के लिए जो इस पर ठोकर खा सकते हैं, 2.6.38 के बाद 'NIPQUAD' को हटा दिया गया है। इसके बजाय – pratikm

+0

इसके बाद '% pI4' का उपयोग करें। अब /net/core/utils.c – BonBon

+0

@BonBon में 'in4_pton()' है, 'in4_pton() 'रिवर्स करता है। –

0

आप प्रत्येक टुकड़े को इसके पूर्णांक रूप में परिवर्तित करने के लिए strtol का उपयोग कर सकते हैं।

+0

मैं लगभग सकारात्मक हूं कि एक मैक्रो मौजूद है जो बस करता है, मुझे बस इसे एटीएम नहीं मिल रहा है। –

2

सरल। "X.x.x.x" प्रारूप में आईपी पता किसी कारण के लिए बिंदीदार-क्वाड कहा जाता है। प्रत्येक पते आपके पते में कुल 4 बाइट्स के लिए बाइट का प्रतिनिधित्व करता है।

तो, 4 बाइट पते के साथ, आप बस प्रत्येक बाइट के दशमलव मान को प्रिंट करेंगे।

त्वरित और गंदे उदाहरण (अपनी पसंद के उत्पादन समारोह साथ printf डालें):

unsigned char *addr = (unsigned char*)sk_buff->addr; 
printf("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); 
+2

इसने कर्नेल – Rohit

0
/* Convinience union to __be32 to ip address */ 
union ip_address { 
    u8 a[4]; 
    __be32 saddr; 
}; 

आईपी पता एक [0] ए [1] ए [2] .एक प्राप्त किया जा सकता [3]

11

आप() printk द्वारा प्रदान की% pI4 विस्तारित स्वरूप विनिर्देशक का उपयोग करना चाहिए:

printk(KERN_DEBUG "IP addres = %pI4\n", &local_ip); 
0

printk इस सीधे संभाल कर सकते हैं:

आईपीवी 4 पते:

%pI4 1.2.3.4 
%pi4 001.002.003.004 
%p[Ii]4[hnbl] 

For printing IPv4 dot-separated decimal addresses. The 'I4' and 'i4' 
specifiers result in a printed address with ('i4') or without ('I4') 
leading zeros. 

The additional 'h', 'n', 'b', and 'l' specifiers are used to specify 
host, network, big or little endian order addresses respectively. Where 
no specifier is provided the default network/big endian order is used. 

Passed by reference. 

IPv6 पते:

%pI6 0001:0002:0003:0004:0005:0006:0007:0008 
%pi6 00010002000300040005000600070008 
%pI6c 1:2:3:4:5:6:7:8 

For printing IPv6 network-order 16-bit hex addresses. The 'I6' and 'i6' 
specifiers result in a printed address with ('I6') or without ('i6') 
colon-separators. Leading zeros are always used. 

The additional 'c' specifier can be used with the 'I' specifier to 
print a compressed IPv6 address as described by 
http://tools.ietf.org/html/rfc5952 

Passed by reference. 

संदर्भ: https://www.kernel.org/doc/Documentation/printk-formats.txt

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^