UDP over IPv6 transport implemented

pull/45/head
elie 2010-01-12 17:51:05 +00:00
parent a5a0f5fecb
commit e511dd5b3e
6 changed files with 60 additions and 3 deletions

View File

@ -1,3 +1,8 @@
Revision 4.1.13a
----------------
- UDP over IPv6 transport implemented.
Revision 4.1.12a
----------------

View File

@ -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

View File

@ -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

View File

@ -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'),)

View File

@ -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,

View File

@ -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"