How can I set DONT_FRAGMENT flag in IP header using python sockets?
The following code
socket.setsockopt(socket.IPPROTO_IP, socket.IP_DONTFRAG, 1)
gives me this error:
AttributeError: 'module' object has no attribute 'IP_DONTFRAG'
Anyone has an idea?
def create_sender_session(self):
logging.debug("Create Sender Session")
if (self.send_ip_ver == 6 or self.resp_ip_ver == 6):
self.sender_socket = socket.socket(
socket.AF_INET6, socket.SOCK_DGRAM)
self.sender_socket.setsockopt(
socket.IPPROTO_IPV6, socket.IPV6_TCLASS, self.tos)
self.sender_socket.setsockopt(
socket.IPPROTO_IPV6, socket.IPV6_UNICAST_HOPS, self.ttl)
else:
self.sender_socket = socket.socket(
socket.AF_INET, socket.SOCK_DGRAM)
self.sender_socket.setsockopt(
socket.SOL_IP, socket.IP_TTL, self.ttl)
self.sender_socket.setsockopt(
socket.IPPROTO_IP, socket.IP_TOS, self.tos)
self.sender_socket.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sender_socket.bind((self.send_addr, self.send_port))
logging.info('Sender started: {}:{}'.format(
self.send_addr, self.send_port))
It's harder to find documentation for some socket options than for others. *DONTFRAG seem to be in the latter category.
Some references:
[IBM]: setsockopt() - Set Socket Options
[FreeBSD]: IP(4) (emphasis is mine):
As a note, Python 2 is no longer maintained (EndOfLife), although at the time the question was asked, it still was, so will switch to Python 3.
[Python.Docs]: socket - Low-level networking interface doesn't mention them. However, only IPV6_DONTFRAG seems to exist.
And that isn't specific to Python.
As IPV6_DONTFRAG name states, it's specific for IPv6 sockets (and it most likely won't work for IPv4):
So, for IPv6 sockets it didn't raise an exception (tests are required to establish whether under the hood it did what is supposed to).
For IPv4, the Path MTU Discovery option can be tried ([SO]: Path MTU Discovery using Socket option - IP_MTU & IP_MTU_DISCOVER).
Don't know how relevant it is, but it seems to be working on Win: