summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2010-01-12 17:51:05 +0000
committerelie <elie>2010-01-12 17:51:05 +0000
commit2b85d47ec5b2d934b06d0230c88d02f119a042ed (patch)
tree3da386588f9f84406686282d930165c3d442e3f0
parentc0c72670e6e9cbb78830e588a4fb544366cf5d28 (diff)
downloadpysnmp-2b85d47ec5b2d934b06d0230c88d02f119a042ed.tar.gz
UDP over IPv6 transport implemented
-rw-r--r--CHANGES5
-rw-r--r--README1
-rw-r--r--pysnmp/carrier/asynsock/dgram/udp6.py10
-rw-r--r--pysnmp/entity/config.py6
-rw-r--r--pysnmp/entity/rfc3413/config.py5
-rw-r--r--pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py36
6 files changed, 60 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index 8a7e5c9..049c930 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+Revision 4.1.13a
+----------------
+
+- UDP over IPv6 transport implemented.
+
Revision 4.1.12a
----------------
diff --git a/README b/README
index 04a7b6c..5cf6a57 100644
--- a/README
+++ b/README
@@ -17,6 +17,7 @@ FEATURES
* Extensible network transports framework (UDP and UNIX domain implemented)
* Asynchronous socket-based IO API support
* Twisted (http://twistedmatrix.com) integration
+* IPv6 transport support
* Python eggs and py2exe friendly
* 100% Python, works with Python 1.5 though 2.x
* MT-safe
diff --git a/pysnmp/carrier/asynsock/dgram/udp6.py b/pysnmp/carrier/asynsock/dgram/udp6.py
new file mode 100644
index 0000000..b0b3f9b
--- /dev/null
+++ b/pysnmp/carrier/asynsock/dgram/udp6.py
@@ -0,0 +1,10 @@
+"""Implements asyncore-based UDP6 transport domain"""
+from socket import AF_INET6
+from pysnmp.carrier.asynsock.dgram.base import DgramSocketTransport
+
+domainName = snmpUDP6Domain = (1, 3, 6, 1, 2, 1, 100, 1, 2)
+
+class Udp6SocketTransport(DgramSocketTransport):
+ sockFamily = AF_INET6
+
+Udp6Transport = Udp6SocketTransport
diff --git a/pysnmp/entity/config.py b/pysnmp/entity/config.py
index 09ebbfc..c137736 100644
--- a/pysnmp/entity/config.py
+++ b/pysnmp/entity/config.py
@@ -2,7 +2,7 @@
# SNMP engine might be configured remotely (through SNMP).
import string
from pysnmp.carrier.asynsock import dispatch
-from pysnmp.carrier.asynsock.dgram import udp
+from pysnmp.carrier.asynsock.dgram import udp, udp6
try:
from pysnmp.carrier.asynsock.dgram import unix
snmpLocalDomain = unix.snmpLocalDomain
@@ -21,6 +21,7 @@ from pysnmp import error
# Transports
snmpUDPDomain = udp.snmpUDPDomain
+snmpUDP6Domain = udp6.snmpUDP6Domain
# Auth protocol
usmHMACMD5AuthProtocol = hmacmd5.HmacMd5.serviceID
@@ -258,6 +259,9 @@ def addTargetAddr(
if transportDomain == snmpUDPDomain:
SnmpUDPAddress, = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder.importSymbols('SNMPv2-TM', 'SnmpUDPAddress')
transportAddress = SnmpUDPAddress(transportAddress)
+ elif transportDomain == snmpUDP6Domain:
+ TransportAddressIPv6, = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder.importSymbols('TRANSPORT-ADDRESS-MIB', 'TransportAddressIPv6')
+ transportAddress = TransportAddressIPv6(transportAddress)
snmpEngine.msgAndPduDsp.mibInstrumController.writeVars(
((snmpTargetAddrEntry.name + (9,) + tblIdx, 'destroy'),)
diff --git a/pysnmp/entity/rfc3413/config.py b/pysnmp/entity/rfc3413/config.py
index d2ca8af..3459d4c 100644
--- a/pysnmp/entity/rfc3413/config.py
+++ b/pysnmp/entity/rfc3413/config.py
@@ -36,6 +36,11 @@ def getTargetAddr(snmpEngine, snmpTargetAddrName):
snmpTargetAddrTAddress = tuple(
SnmpUDPAddress(snmpTargetAddrTAddress)
)
+ elif snmpTargetAddrTDomain == config.snmpUDP6Domain:
+ TransportAddressIPv6, = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder.importSymbols('TRANSPORT-ADDRESS-MIB', 'TransportAddressIPv6')
+ snmpTargetAddrTAddress = tuple(
+ TransportAddressIPv6(snmpTargetAddrTAddress)
+ )
return ( snmpTargetAddrTDomain,
snmpTargetAddrTAddress,
diff --git a/pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py b/pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py
index e6d89d1..5168085 100644
--- a/pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py
+++ b/pysnmp/smi/mibs/TRANSPORT-ADDRESS-MIB.py
@@ -2,6 +2,9 @@
# by libsmi2pysnmp-0.0.9-alpha at Thu Mar 26 20:58:12 2009,
# Python version (2, 4, 4, 'final', 0)
+import socket
+import types
+
# Imported just in case new ASN.1 types would be created
from pyasn1.type import constraint, namedval
@@ -26,7 +29,21 @@ class TransportAddressIPv4(TextualConvention, OctetString):
displayHint = "1d.1d.1d.1d:2d"
subtypeSpec = OctetString.subtypeSpec+constraint.ValueSizeConstraint(6,6)
fixedLength = 6
- pass
+
+ def prettyIn(self, value):
+ if type(value) == types.TupleType:
+ return reduce(lambda x,y: x+y, map(lambda x: chr(string.atoi(x)), string.split(value[0], '.'))) + chr((value[1] >> 8) & 0xff) + chr((value[1] & 0xff))
+ else:
+ return OctetString.prettyIn(self, value)
+
+ # Socket address syntax coercion
+ def __getitem__(self, i):
+ if not hasattr(self, '__tuple_value'):
+ self.__tuple_value = (
+ string.join(map(lambda x: str(ord(x)), self._value[:4]), '.'),
+ ord(self._value[4:5]) << 8 | ord(self._value[5:6])
+ )
+ return self.__tuple_value[i]
class TransportAddressIPv4z(TextualConvention, OctetString):
displayHint = "1d.1d.1d.1d%4d:2d"
@@ -38,7 +55,22 @@ class TransportAddressIPv6(TextualConvention, OctetString):
displayHint = "0a[2x:2x:2x:2x:2x:2x:2x:2x]0a:2d"
subtypeSpec = OctetString.subtypeSpec+constraint.ValueSizeConstraint(18,18)
fixedLength = 18
- pass
+
+ def prettyIn(self, value):
+ if type(value) == types.TupleType:
+ return socket.inet_pton(socket.AF_INET6, value[0]) + chr((value[1] >> 8) & 0xff) + chr((value[1] & 0xff))
+ else:
+ return OctetString.prettyIn(self, value)
+
+ # Socket address syntax coercion
+ def __getitem__(self, i):
+ if not hasattr(self, '__tuple_value'):
+ self.__tuple_value = (
+ socket.inet_ntop(socket.AF_INET6, self._value[:16]),
+ ord(self._value[16:17]) << 8 | ord(self._value[17:18]),
+ 0,
+ 0)
+ return self.__tuple_value[i]
class TransportAddressIPv6z(TextualConvention, OctetString):
displayHint = "0a[2x:2x:2x:2x:2x:2x:2x:2x%4d]0a:2d"