Kaydet (Commit) b8e17170 authored tarafından Andrew M. Kuchling's avatar Andrew M. Kuchling

[Patch #947352 from Jason Andryuk] Add support for AF_PACKET hardware addresses

üst e6f8a89d
...@@ -50,9 +50,7 @@ Module interface: ...@@ -50,9 +50,7 @@ Module interface:
specifying the ethernet interface and an integer specifying specifying the ethernet interface and an integer specifying
the Ethernet protocol number to be received. For example: the Ethernet protocol number to be received. For example:
("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
specify packet-type and ha-type/addr -- these are ignored by specify packet-type and ha-type/addr.
networking code, but accepted since they are returned by the
getsockname() method.
Local naming conventions: Local naming conventions:
...@@ -1223,10 +1221,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1223,10 +1221,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
int protoNumber; int protoNumber;
int hatype = 0; int hatype = 0;
int pkttype = 0; int pkttype = 0;
char *haddr; char *haddr = NULL;
unsigned int halen = 0;
if (!PyArg_ParseTuple(args, "si|iis", &interfaceName, if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
&protoNumber, &pkttype, &hatype, &haddr)) &protoNumber, &pkttype, &hatype,
&haddr, &halen))
return 0; return 0;
strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name)); strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0'; ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
...@@ -1240,6 +1240,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1240,6 +1240,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
addr->sll_ifindex = ifr.ifr_ifindex; addr->sll_ifindex = ifr.ifr_ifindex;
addr->sll_pkttype = pkttype; addr->sll_pkttype = pkttype;
addr->sll_hatype = hatype; addr->sll_hatype = hatype;
if (halen > 8) {
PyErr_SetString(PyExc_ValueError,
"Hardware address must be 8 bytes or less");
return 0;
}
if (halen != 0) {
memcpy(&addr->sll_addr, haddr, halen);
}
addr->sll_halen = halen;
*addr_ret = (struct sockaddr *) addr; *addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
return 1; return 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment