Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
15578eeb
Commit
15578eeb
authored
Jan 17, 2006
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
parents
8f28afac
3860288e
Changes
37
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
543 additions
and
565 deletions
+543
-565
drivers/net/cassini.c
drivers/net/cassini.c
+2
-2
drivers/net/tg3.c
drivers/net/tg3.c
+54
-28
drivers/net/tg3.h
drivers/net/tg3.h
+1
-0
include/linux/kernel.h
include/linux/kernel.h
+1
-0
include/linux/netfilter_ipv6/ip6t_ah.h
include/linux/netfilter_ipv6/ip6t_ah.h
+0
-9
include/linux/netfilter_ipv6/ip6t_esp.h
include/linux/netfilter_ipv6/ip6t_esp.h
+0
-9
include/linux/netfilter_ipv6/ip6t_frag.h
include/linux/netfilter_ipv6/ip6t_frag.h
+0
-9
include/linux/netfilter_ipv6/ip6t_opts.h
include/linux/netfilter_ipv6/ip6t_opts.h
+0
-9
include/linux/netfilter_ipv6/ip6t_rt.h
include/linux/netfilter_ipv6/ip6t_rt.h
+0
-9
include/linux/skbuff.h
include/linux/skbuff.h
+1
-1
net/bridge/netfilter/ebt_ip.c
net/bridge/netfilter/ebt_ip.c
+3
-1
net/bridge/netfilter/ebt_log.c
net/bridge/netfilter/ebt_log.c
+3
-1
net/core/filter.c
net/core/filter.c
+6
-7
net/core/netpoll.c
net/core/netpoll.c
+1
-1
net/core/pktgen.c
net/core/pktgen.c
+11
-23
net/dccp/ackvec.c
net/dccp/ackvec.c
+1
-1
net/ipv4/netfilter/Makefile
net/ipv4/netfilter/Makefile
+0
-1
net/ipv4/netfilter/ip_conntrack_proto_gre.c
net/ipv4/netfilter/ip_conntrack_proto_gre.c
+1
-0
net/ipv4/netfilter/ipt_policy.c
net/ipv4/netfilter/ipt_policy.c
+5
-2
net/ipv4/route.c
net/ipv4/route.c
+4
-10
net/ipv6/addrconf.c
net/ipv6/addrconf.c
+1
-1
net/ipv6/anycast.c
net/ipv6/anycast.c
+1
-1
net/ipv6/ip6_flowlabel.c
net/ipv6/ip6_flowlabel.c
+2
-2
net/ipv6/mcast.c
net/ipv6/mcast.c
+3
-3
net/ipv6/netfilter/Makefile
net/ipv6/netfilter/Makefile
+0
-1
net/ipv6/netfilter/ip6t_dst.c
net/ipv6/netfilter/ip6t_dst.c
+75
-76
net/ipv6/netfilter/ip6t_eui64.c
net/ipv6/netfilter/ip6t_eui64.c
+34
-34
net/ipv6/netfilter/ip6t_frag.c
net/ipv6/netfilter/ip6t_frag.c
+78
-79
net/ipv6/netfilter/ip6t_hbh.c
net/ipv6/netfilter/ip6t_hbh.c
+75
-76
net/ipv6/netfilter/ip6t_ipv6header.c
net/ipv6/netfilter/ip6t_ipv6header.c
+39
-40
net/ipv6/netfilter/ip6t_owner.c
net/ipv6/netfilter/ip6t_owner.c
+14
-14
net/ipv6/netfilter/ip6t_policy.c
net/ipv6/netfilter/ip6t_policy.c
+1
-1
net/ipv6/netfilter/ip6t_rt.c
net/ipv6/netfilter/ip6t_rt.c
+112
-103
net/rxrpc/krxtimod.c
net/rxrpc/krxtimod.c
+1
-1
net/rxrpc/proc.c
net/rxrpc/proc.c
+6
-6
net/sched/sch_prio.c
net/sched/sch_prio.c
+3
-4
net/sched/sch_sfq.c
net/sched/sch_sfq.c
+4
-0
No files found.
drivers/net/cassini.c
View file @
15578eeb
...
...
@@ -1925,8 +1925,8 @@ static void cas_tx(struct net_device *dev, struct cas *cp,
u64
compwb
=
le64_to_cpu
(
cp
->
init_block
->
tx_compwb
);
#endif
if
(
netif_msg_intr
(
cp
))
printk
(
KERN_DEBUG
"%s: tx interrupt, status: 0x%x, %lx
\n
"
,
cp
->
dev
->
name
,
status
,
compwb
);
printk
(
KERN_DEBUG
"%s: tx interrupt, status: 0x%x, %l
l
x
\n
"
,
cp
->
dev
->
name
,
status
,
(
unsigned
long
long
)
compwb
);
/* process all the rings */
for
(
ring
=
0
;
ring
<
N_TX_RINGS
;
ring
++
)
{
#ifdef USE_TX_COMPWB
...
...
drivers/net/tg3.c
View file @
15578eeb
...
...
@@ -69,8 +69,8 @@
#define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "3.4
7
"
#define DRV_MODULE_RELDATE "
Dec 28, 2005
"
#define DRV_MODULE_VERSION "3.4
8
"
#define DRV_MODULE_RELDATE "
Jan 16, 2006
"
#define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0
...
...
@@ -1325,10 +1325,12 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
val
&=
~
((
1
<<
16
)
|
(
1
<<
4
)
|
(
1
<<
2
)
|
(
1
<<
1
)
|
1
);
tw32
(
0x7d00
,
val
);
if
(
!
(
tp
->
tg3_flags
&
TG3_FLAG_ENABLE_ASF
))
{
tg3_nvram_lock
(
tp
);
int
err
;
err
=
tg3_nvram_lock
(
tp
);
tg3_halt_cpu
(
tp
,
RX_CPU_BASE
);
tw32_f
(
NVRAM_SWARB
,
SWARB_REQ_CLR0
);
tg3_nvram_unlock
(
tp
);
if
(
!
err
)
tg3_nvram_unlock
(
tp
);
}
}
...
...
@@ -4193,14 +4195,19 @@ static int tg3_nvram_lock(struct tg3 *tp)
if
(
tp
->
tg3_flags
&
TG3_FLAG_NVRAM
)
{
int
i
;
tw32
(
NVRAM_SWARB
,
SWARB_REQ_SET1
);
for
(
i
=
0
;
i
<
8000
;
i
++
)
{
if
(
tr32
(
NVRAM_SWARB
)
&
SWARB_GNT1
)
break
;
udelay
(
20
);
if
(
tp
->
nvram_lock_cnt
==
0
)
{
tw32
(
NVRAM_SWARB
,
SWARB_REQ_SET1
);
for
(
i
=
0
;
i
<
8000
;
i
++
)
{
if
(
tr32
(
NVRAM_SWARB
)
&
SWARB_GNT1
)
break
;
udelay
(
20
);
}
if
(
i
==
8000
)
{
tw32
(
NVRAM_SWARB
,
SWARB_REQ_CLR1
);
return
-
ENODEV
;
}
}
if
(
i
==
8000
)
return
-
ENODEV
;
tp
->
nvram_lock_cnt
++
;
}
return
0
;
}
...
...
@@ -4208,8 +4215,12 @@ static int tg3_nvram_lock(struct tg3 *tp)
/* tp->lock is held. */
static
void
tg3_nvram_unlock
(
struct
tg3
*
tp
)
{
if
(
tp
->
tg3_flags
&
TG3_FLAG_NVRAM
)
tw32_f
(
NVRAM_SWARB
,
SWARB_REQ_CLR1
);
if
(
tp
->
tg3_flags
&
TG3_FLAG_NVRAM
)
{
if
(
tp
->
nvram_lock_cnt
>
0
)
tp
->
nvram_lock_cnt
--
;
if
(
tp
->
nvram_lock_cnt
==
0
)
tw32_f
(
NVRAM_SWARB
,
SWARB_REQ_CLR1
);
}
}
/* tp->lock is held. */
...
...
@@ -4320,8 +4331,13 @@ static int tg3_chip_reset(struct tg3 *tp)
void
(
*
write_op
)(
struct
tg3
*
,
u32
,
u32
);
int
i
;
if
(
!
(
tp
->
tg3_flags2
&
TG3_FLG2_SUN_570X
))
if
(
!
(
tp
->
tg3_flags2
&
TG3_FLG2_SUN_570X
))
{
tg3_nvram_lock
(
tp
);
/* No matching tg3_nvram_unlock() after this because
* chip reset below will undo the nvram lock.
*/
tp
->
nvram_lock_cnt
=
0
;
}
/*
* We must avoid the readl() that normally takes place.
...
...
@@ -4717,6 +4733,10 @@ static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
(
offset
==
RX_CPU_BASE
?
"RX"
:
"TX"
));
return
-
ENODEV
;
}
/* Clear firmware's nvram arbitration. */
if
(
tp
->
tg3_flags
&
TG3_FLAG_NVRAM
)
tw32
(
NVRAM_SWARB
,
SWARB_REQ_CLR0
);
return
0
;
}
...
...
@@ -4736,7 +4756,7 @@ struct fw_info {
static
int
tg3_load_firmware_cpu
(
struct
tg3
*
tp
,
u32
cpu_base
,
u32
cpu_scratch_base
,
int
cpu_scratch_size
,
struct
fw_info
*
info
)
{
int
err
,
i
;
int
err
,
lock_err
,
i
;
void
(
*
write_op
)(
struct
tg3
*
,
u32
,
u32
);
if
(
cpu_base
==
TX_CPU_BASE
&&
...
...
@@ -4755,9 +4775,10 @@ static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, u32 cpu_scratch_b
/* It is possible that bootcode is still loading at this point.
* Get the nvram lock first before halting the cpu.
*/
tg3_nvram_lock
(
tp
);
lock_err
=
tg3_nvram_lock
(
tp
);
err
=
tg3_halt_cpu
(
tp
,
cpu_base
);
tg3_nvram_unlock
(
tp
);
if
(
!
lock_err
)
tg3_nvram_unlock
(
tp
);
if
(
err
)
goto
out
;
...
...
@@ -8182,7 +8203,7 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
data
[
1
]
=
1
;
}
if
(
etest
->
flags
&
ETH_TEST_FL_OFFLINE
)
{
int
irq_sync
=
0
;
int
err
,
irq_sync
=
0
;
if
(
netif_running
(
dev
))
{
tg3_netif_stop
(
tp
);
...
...
@@ -8192,11 +8213,12 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
tg3_full_lock
(
tp
,
irq_sync
);
tg3_halt
(
tp
,
RESET_KIND_SUSPEND
,
1
);
tg3_nvram_lock
(
tp
);
err
=
tg3_nvram_lock
(
tp
);
tg3_halt_cpu
(
tp
,
RX_CPU_BASE
);
if
(
!
(
tp
->
tg3_flags2
&
TG3_FLG2_5705_PLUS
))
tg3_halt_cpu
(
tp
,
TX_CPU_BASE
);
tg3_nvram_unlock
(
tp
);
if
(
!
err
)
tg3_nvram_unlock
(
tp
);
if
(
tg3_test_registers
(
tp
)
!=
0
)
{
etest
->
flags
|=
ETH_TEST_FL_FAILED
;
...
...
@@ -8588,7 +8610,11 @@ static void __devinit tg3_nvram_init(struct tg3 *tp)
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
!=
ASIC_REV_5701
)
{
tp
->
tg3_flags
|=
TG3_FLAG_NVRAM
;
tg3_nvram_lock
(
tp
);
if
(
tg3_nvram_lock
(
tp
))
{
printk
(
KERN_WARNING
PFX
"%s: Cannot get nvarm lock, "
"tg3_nvram_init failed.
\n
"
,
tp
->
dev
->
name
);
return
;
}
tg3_enable_nvram_access
(
tp
);
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5752
)
...
...
@@ -8686,7 +8712,9 @@ static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
if
(
offset
>
NVRAM_ADDR_MSK
)
return
-
EINVAL
;
tg3_nvram_lock
(
tp
);
ret
=
tg3_nvram_lock
(
tp
);
if
(
ret
)
return
ret
;
tg3_enable_nvram_access
(
tp
);
...
...
@@ -8785,10 +8813,6 @@ static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
offset
=
offset
+
(
pagesize
-
page_off
);
/* Nvram lock released by tg3_nvram_read() above,
* so need to get it again.
*/
tg3_nvram_lock
(
tp
);
tg3_enable_nvram_access
(
tp
);
/*
...
...
@@ -8925,7 +8949,9 @@ static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
else
{
u32
grc_mode
;
tg3_nvram_lock
(
tp
);
ret
=
tg3_nvram_lock
(
tp
);
if
(
ret
)
return
ret
;
tg3_enable_nvram_access
(
tp
);
if
((
tp
->
tg3_flags2
&
TG3_FLG2_5750_PLUS
)
&&
...
...
drivers/net/tg3.h
View file @
15578eeb
...
...
@@ -2275,6 +2275,7 @@ struct tg3 {
dma_addr_t
stats_mapping
;
struct
work_struct
reset_task
;
int
nvram_lock_cnt
;
u32
nvram_size
;
u32
nvram_pagesize
;
u32
nvram_jedecnum
;
...
...
include/linux/kernel.h
View file @
15578eeb
...
...
@@ -228,6 +228,7 @@ extern void dump_stack(void);
ntohs((addr).s6_addr16[6]), \
ntohs((addr).s6_addr16[7])
#define NIP6_FMT "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x"
#define NIP6_SEQFMT "%04x%04x%04x%04x%04x%04x%04x%04x"
#if defined(__LITTLE_ENDIAN)
#define HIPQUAD(addr) \
...
...
include/linux/netfilter_ipv6/ip6t_ah.h
View file @
15578eeb
...
...
@@ -18,13 +18,4 @@ struct ip6t_ah
#define IP6T_AH_INV_LEN 0x02
/* Invert the sense of length. */
#define IP6T_AH_INV_MASK 0x03
/* All possible flags. */
#define MASK_HOPOPTS 128
#define MASK_DSTOPTS 64
#define MASK_ROUTING 32
#define MASK_FRAGMENT 16
#define MASK_AH 8
#define MASK_ESP 4
#define MASK_NONE 2
#define MASK_PROTO 1
#endif
/*_IP6T_AH_H*/
include/linux/netfilter_ipv6/ip6t_esp.h
View file @
15578eeb
...
...
@@ -7,15 +7,6 @@ struct ip6t_esp
u_int8_t
invflags
;
/* Inverse flags */
};
#define MASK_HOPOPTS 128
#define MASK_DSTOPTS 64
#define MASK_ROUTING 32
#define MASK_FRAGMENT 16
#define MASK_AH 8
#define MASK_ESP 4
#define MASK_NONE 2
#define MASK_PROTO 1
/* Values for "invflags" field in struct ip6t_esp. */
#define IP6T_ESP_INV_SPI 0x01
/* Invert the sense of spi. */
#define IP6T_ESP_INV_MASK 0x01
/* All possible flags. */
...
...
include/linux/netfilter_ipv6/ip6t_frag.h
View file @
15578eeb
...
...
@@ -21,13 +21,4 @@ struct ip6t_frag
#define IP6T_FRAG_INV_LEN 0x02
/* Invert the sense of length. */
#define IP6T_FRAG_INV_MASK 0x03
/* All possible flags. */
#define MASK_HOPOPTS 128
#define MASK_DSTOPTS 64
#define MASK_ROUTING 32
#define MASK_FRAGMENT 16
#define MASK_AH 8
#define MASK_ESP 4
#define MASK_NONE 2
#define MASK_PROTO 1
#endif
/*_IP6T_FRAG_H*/
include/linux/netfilter_ipv6/ip6t_opts.h
View file @
15578eeb
...
...
@@ -20,13 +20,4 @@ struct ip6t_opts
#define IP6T_OPTS_INV_LEN 0x01
/* Invert the sense of length. */
#define IP6T_OPTS_INV_MASK 0x01
/* All possible flags. */
#define MASK_HOPOPTS 128
#define MASK_DSTOPTS 64
#define MASK_ROUTING 32
#define MASK_FRAGMENT 16
#define MASK_AH 8
#define MASK_ESP 4
#define MASK_NONE 2
#define MASK_PROTO 1
#endif
/*_IP6T_OPTS_H*/
include/linux/netfilter_ipv6/ip6t_rt.h
View file @
15578eeb
...
...
@@ -30,13 +30,4 @@ struct ip6t_rt
#define IP6T_RT_INV_LEN 0x04
/* Invert the sense of length. */
#define IP6T_RT_INV_MASK 0x07
/* All possible flags. */
#define MASK_HOPOPTS 128
#define MASK_DSTOPTS 64
#define MASK_ROUTING 32
#define MASK_FRAGMENT 16
#define MASK_AH 8
#define MASK_ESP 4
#define MASK_NONE 2
#define MASK_PROTO 1
#endif
/*_IP6T_RT_H*/
include/linux/skbuff.h
View file @
15578eeb
...
...
@@ -926,7 +926,7 @@ static inline int skb_tailroom(const struct sk_buff *skb)
* Increase the headroom of an empty &sk_buff by reducing the tail
* room. This is only allowed for an empty buffer.
*/
static
inline
void
skb_reserve
(
struct
sk_buff
*
skb
,
unsigned
int
len
)
static
inline
void
skb_reserve
(
struct
sk_buff
*
skb
,
int
len
)
{
skb
->
data
+=
len
;
skb
->
tail
+=
len
;
...
...
net/bridge/netfilter/ebt_ip.c
View file @
15578eeb
...
...
@@ -92,7 +92,9 @@ static int ebt_ip_check(const char *tablename, unsigned int hookmask,
if
(
info
->
invflags
&
EBT_IP_PROTO
)
return
-
EINVAL
;
if
(
info
->
protocol
!=
IPPROTO_TCP
&&
info
->
protocol
!=
IPPROTO_UDP
)
info
->
protocol
!=
IPPROTO_UDP
&&
info
->
protocol
!=
IPPROTO_SCTP
&&
info
->
protocol
!=
IPPROTO_DCCP
)
return
-
EINVAL
;
}
if
(
info
->
bitmask
&
EBT_IP_DPORT
&&
info
->
dport
[
0
]
>
info
->
dport
[
1
])
...
...
net/bridge/netfilter/ebt_log.c
View file @
15578eeb
...
...
@@ -95,7 +95,9 @@ ebt_log_packet(unsigned int pf, unsigned int hooknum,
"tos=0x%02X, IP proto=%d"
,
NIPQUAD
(
ih
->
saddr
),
NIPQUAD
(
ih
->
daddr
),
ih
->
tos
,
ih
->
protocol
);
if
(
ih
->
protocol
==
IPPROTO_TCP
||
ih
->
protocol
==
IPPROTO_UDP
)
{
ih
->
protocol
==
IPPROTO_UDP
||
ih
->
protocol
==
IPPROTO_SCTP
||
ih
->
protocol
==
IPPROTO_DCCP
)
{
struct
tcpudphdr
_ports
,
*
pptr
;
pptr
=
skb_header_pointer
(
skb
,
ih
->
ihl
*
4
,
...
...
net/core/filter.c
View file @
15578eeb
...
...
@@ -74,7 +74,6 @@ static inline void *load_pointer(struct sk_buff *skb, int k,
* filtering, filter is the array of filter instructions, and
* len is the number of filter blocks in the array.
*/
unsigned
int
sk_run_filter
(
struct
sk_buff
*
skb
,
struct
sock_filter
*
filter
,
int
flen
)
{
struct
sock_filter
*
fentry
;
/* We walk down these */
...
...
@@ -175,7 +174,7 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
continue
;
case
BPF_LD
|
BPF_W
|
BPF_ABS
:
k
=
fentry
->
k
;
load_w:
load_w:
ptr
=
load_pointer
(
skb
,
k
,
4
,
&
tmp
);
if
(
ptr
!=
NULL
)
{
A
=
ntohl
(
*
(
u32
*
)
ptr
);
...
...
@@ -184,7 +183,7 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
break
;
case
BPF_LD
|
BPF_H
|
BPF_ABS
:
k
=
fentry
->
k
;
load_h:
load_h:
ptr
=
load_pointer
(
skb
,
k
,
2
,
&
tmp
);
if
(
ptr
!=
NULL
)
{
A
=
ntohs
(
*
(
u16
*
)
ptr
);
...
...
@@ -374,7 +373,7 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
case
BPF_JMP
|
BPF_JSET
|
BPF_K
:
case
BPF_JMP
|
BPF_JSET
|
BPF_X
:
/* for conditionals both must be safe */
if
(
pc
+
ftest
->
jt
+
1
>=
flen
||
if
(
pc
+
ftest
->
jt
+
1
>=
flen
||
pc
+
ftest
->
jf
+
1
>=
flen
)
return
-
EINVAL
;
break
;
...
...
@@ -384,7 +383,7 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
}
}
return
(
BPF_CLASS
(
filter
[
flen
-
1
].
code
)
==
BPF_RET
)
?
0
:
-
EINVAL
;
return
(
BPF_CLASS
(
filter
[
flen
-
1
].
code
)
==
BPF_RET
)
?
0
:
-
EINVAL
;
}
/**
...
...
@@ -404,8 +403,8 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
int
err
;
/* Make sure new filter is there and in the right amounts. */
if
(
fprog
->
filter
==
NULL
)
return
-
EINVAL
;
if
(
fprog
->
filter
==
NULL
)
return
-
EINVAL
;
fp
=
sock_kmalloc
(
sk
,
fsize
+
sizeof
(
*
fp
),
GFP_KERNEL
);
if
(
!
fp
)
...
...
net/core/netpoll.c
View file @
15578eeb
...
...
@@ -703,7 +703,7 @@ int netpoll_setup(struct netpoll *np)
}
}
if
(
!
memcmp
(
np
->
local_mac
,
"
\0\0\0\0\0\0
"
,
6
)
&&
ndev
->
dev_addr
)
if
(
is_zero_ether_addr
(
np
->
local_mac
)
&&
ndev
->
dev_addr
)
memcpy
(
np
->
local_mac
,
ndev
->
dev_addr
,
6
);
if
(
!
np
->
local_ip
)
{
...
...
net/core/pktgen.c
View file @
15578eeb
...
...
@@ -139,6 +139,7 @@
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/wait.h>
#include <linux/etherdevice.h>
#include <net/checksum.h>
#include <net/ipv6.h>
#include <net/addrconf.h>
...
...
@@ -281,8 +282,8 @@ struct pktgen_dev {
__u32
src_mac_count
;
/* How many MACs to iterate through */
__u32
dst_mac_count
;
/* How many MACs to iterate through */
unsigned
char
dst_mac
[
6
];
unsigned
char
src_mac
[
6
];
unsigned
char
dst_mac
[
ETH_ALEN
];
unsigned
char
src_mac
[
ETH_ALEN
];
__u32
cur_dst_mac_offset
;
__u32
cur_src_mac_offset
;
...
...
@@ -594,16 +595,9 @@ static int pktgen_if_show(struct seq_file *seq, void *v)
seq_puts
(
seq
,
" src_mac: "
);
if
((
pkt_dev
->
src_mac
[
0
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
1
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
2
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
3
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
4
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
5
]
==
0
))
if
(
is_zero_ether_addr
(
pkt_dev
->
src_mac
))
for
(
i
=
0
;
i
<
6
;
i
++
)
seq_printf
(
seq
,
"%02X%s"
,
pkt_dev
->
odev
->
dev_addr
[
i
],
i
==
5
?
" "
:
":"
);
else
for
(
i
=
0
;
i
<
6
;
i
++
)
seq_printf
(
seq
,
"%02X%s"
,
pkt_dev
->
src_mac
[
i
],
i
==
5
?
" "
:
":"
);
...
...
@@ -1189,9 +1183,9 @@ static ssize_t pktgen_if_write(struct file *file, const char __user *user_buffer
}
if
(
!
strcmp
(
name
,
"dst_mac"
))
{
char
*
v
=
valstr
;
unsigned
char
old_dmac
[
6
];
unsigned
char
old_dmac
[
ETH_ALEN
];
unsigned
char
*
m
=
pkt_dev
->
dst_mac
;
memcpy
(
old_dmac
,
pkt_dev
->
dst_mac
,
6
);
memcpy
(
old_dmac
,
pkt_dev
->
dst_mac
,
ETH_ALEN
);
len
=
strn_len
(
&
user_buffer
[
i
],
sizeof
(
valstr
)
-
1
);
if
(
len
<
0
)
{
return
len
;
}
...
...
@@ -1220,8 +1214,8 @@ static ssize_t pktgen_if_write(struct file *file, const char __user *user_buffer
}
/* Set up Dest MAC */
if
(
memcmp
(
old_dmac
,
pkt_dev
->
dst_mac
,
6
)
!=
0
)
memcpy
(
&
(
pkt_dev
->
hh
[
0
]),
pkt_dev
->
dst_mac
,
6
);
if
(
compare_ether_addr
(
old_dmac
,
pkt_dev
->
dst_mac
))
memcpy
(
&
(
pkt_dev
->
hh
[
0
]),
pkt_dev
->
dst_mac
,
ETH_ALEN
);
sprintf
(
pg_result
,
"OK: dstmac"
);
return
count
;
...
...
@@ -1560,17 +1554,11 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
/* Default to the interface's mac if not explicitly set. */
if
((
pkt_dev
->
src_mac
[
0
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
1
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
2
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
3
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
4
]
==
0
)
&&
(
pkt_dev
->
src_mac
[
5
]
==
0
))
{
if
(
is_zero_ether_addr
(
pkt_dev
->
src_mac
))
memcpy
(
&
(
pkt_dev
->
hh
[
6
]),
pkt_dev
->
odev
->
dev_addr
,
ETH_ALEN
);
memcpy
(
&
(
pkt_dev
->
hh
[
6
]),
pkt_dev
->
odev
->
dev_addr
,
6
);
}
/* Set up Dest MAC */
memcpy
(
&
(
pkt_dev
->
hh
[
0
]),
pkt_dev
->
dst_mac
,
6
);
memcpy
(
&
(
pkt_dev
->
hh
[
0
]),
pkt_dev
->
dst_mac
,
ETH_ALEN
);
/* Set up pkt size */
pkt_dev
->
cur_pkt_size
=
pkt_dev
->
min_pkt_size
;
...
...
net/dccp/ackvec.c
View file @
15578eeb
...
...
@@ -144,7 +144,7 @@ static inline int dccp_ackvec_set_buf_head_state(struct dccp_ackvec *av,
const
unsigned
char
state
)
{
unsigned
int
gap
;
signed
long
new_head
;
long
new_head
;
if
(
av
->
dccpav_vec_len
+
packets
>
av
->
dccpav_buf_len
)
return
-
ENOBUFS
;
...
...
net/ipv4/netfilter/Makefile
View file @
15578eeb
...
...
@@ -46,7 +46,6 @@ obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o
obj-$(CONFIG_IP_NF_RAW)
+=
iptable_raw.o
# matches
obj-$(CONFIG_IP_NF_MATCH_HELPER)
+=
ipt_helper.o
obj-$(CONFIG_IP_NF_MATCH_HASHLIMIT)
+=
ipt_hashlimit.o
obj-$(CONFIG_IP_NF_MATCH_IPRANGE)
+=
ipt_iprange.o
obj-$(CONFIG_IP_NF_MATCH_MULTIPORT)
+=
ipt_multiport.o
...
...
net/ipv4/netfilter/ip_conntrack_proto_gre.c
View file @
15578eeb
...
...
@@ -32,6 +32,7 @@
#include <linux/in.h>
#include <linux/list.h>
#include <linux/seq_file.h>
#include <linux/interrupt.h>
static
DEFINE_RWLOCK
(
ip_ct_gre_lock
);
#define ASSERT_READ_LOCK(x)
...
...
net/ipv4/netfilter/ipt_policy.c
View file @
15578eeb
...
...
@@ -95,7 +95,10 @@ match_policy_out(const struct sk_buff *skb, const struct ipt_policy_info *info)
static
int
match
(
const
struct
sk_buff
*
skb
,
const
struct
net_device
*
in
,
const
struct
net_device
*
out
,
const
void
*
matchinfo
,
int
offset
,
int
*
hotdrop
)
const
void
*
matchinfo
,
int
offset
,
unsigned
int
protoff
,
int
*
hotdrop
)
{
const
struct
ipt_policy_info
*
info
=
matchinfo
;
int
ret
;
...
...
@@ -113,7 +116,7 @@ static int match(const struct sk_buff *skb,
return
ret
;
}
static
int
checkentry
(
const
char
*
tablename
,
const
struct
ipt_ip
*
ip
,
static
int
checkentry
(
const
char
*
tablename
,
const
void
*
ip_void
,
void
*
matchinfo
,
unsigned
int
matchsize
,
unsigned
int
hook_mask
)
{
...
...
net/ipv4/route.c
View file @
15578eeb
...
...
@@ -240,9 +240,8 @@ static unsigned rt_hash_mask;
static
int
rt_hash_log
;
static
unsigned
int
rt_hash_rnd
;
static
struct
rt_cache_stat
*
rt_cache_stat
;
#define RT_CACHE_STAT_INC(field) \
(per_cpu_ptr(rt_cache_stat, raw_smp_processor_id())->field++)
static
DEFINE_PER_CPU
(
struct
rt_cache_stat
,
rt_cache_stat
);
#define RT_CACHE_STAT_INC(field) (__get_cpu_var(rt_cache_stat).field++)
static
int
rt_intern_hash
(
unsigned
hash
,
struct
rtable
*
rth
,
struct
rtable
**
res
);
...
...
@@ -401,7 +400,7 @@ static void *rt_cpu_seq_start(struct seq_file *seq, loff_t *pos)
if
(
!
cpu_possible
(
cpu
))
continue
;
*
pos
=
cpu
+
1
;
return
per_cpu_ptr
(
rt_cache_stat
,
cpu
);
return
&
per_cpu
(
rt_cache_stat
,
cpu
);
}
return
NULL
;
}
...
...
@@ -414,7 +413,7 @@ static void *rt_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos)
if
(
!
cpu_possible
(
cpu
))
continue
;
*
pos
=
cpu
+
1
;
return
per_cpu_ptr
(
rt_cache_stat
,
cpu
);
return
&
per_cpu
(
rt_cache_stat
,
cpu
);
}
return
NULL
;
...
...
@@ -3160,10 +3159,6 @@ int __init ip_rt_init(void)
ipv4_dst_ops
.
gc_thresh
=
(
rt_hash_mask
+
1
);
ip_rt_max_size
=
(
rt_hash_mask
+
1
)
*
16
;
rt_cache_stat
=
alloc_percpu
(
struct
rt_cache_stat
);
if
(
!
rt_cache_stat
)
return
-
ENOMEM
;
devinet_init
();
ip_fib_init
();
...
...
@@ -3191,7 +3186,6 @@ int __init ip_rt_init(void)
if
(
!
proc_net_fops_create
(
"rt_cache"
,
S_IRUGO
,
&
rt_cache_seq_fops
)
||
!
(
rtstat_pde
=
create_proc_entry
(
"rt_cache"
,
S_IRUGO
,
proc_net_stat
)))
{
free_percpu
(
rt_cache_stat
);
return
-
ENOMEM
;
}
rtstat_pde
->
proc_fops
=
&
rt_cpu_seq_fops
;
...
...
net/ipv6/addrconf.c
View file @
15578eeb
...
...
@@ -2644,7 +2644,7 @@ static int if6_seq_show(struct seq_file *seq, void *v)
{
struct
inet6_ifaddr
*
ifp
=
(
struct
inet6_ifaddr
*
)
v
;
seq_printf
(
seq
,
NIP6_FMT
" %02x %02x %02x %02x %8s
\n
"
,
NIP6_
SEQ
FMT
" %02x %02x %02x %02x %8s
\n
"
,
NIP6
(
ifp
->
addr
),
ifp
->
idev
->
dev
->
ifindex
,
ifp
->
prefix_len
,
...
...
net/ipv6/anycast.c
View file @
15578eeb
...
...
@@ -532,7 +532,7 @@ static int ac6_seq_show(struct seq_file *seq, void *v)
struct
ac6_iter_state
*
state
=
ac6_seq_private
(
seq
);
seq_printf
(
seq
,
"%-4d %-15s "
NIP6_FMT
" %5d
\n
"
,
"%-4d %-15s "
NIP6_
SEQ
FMT
" %5d
\n
"
,
state
->
dev
->
ifindex
,
state
->
dev
->
name
,
NIP6
(
im
->
aca_addr
),
im
->
aca_users
);
...
...
net/ipv6/ip6_flowlabel.c
View file @
15578eeb
...
...
@@ -629,7 +629,7 @@ static void ip6fl_fl_seq_show(struct seq_file *seq, struct ip6_flowlabel *fl)
{
while
(
fl
)
{
seq_printf
(
seq
,
"%05X %-1d %-6d %-6d %-6ld %-8ld "
NIP6_FMT
" %-4d
\n
"
,
"%05X %-1d %-6d %-6d %-6ld %-8ld "
NIP6_
SEQ
FMT
" %-4d
\n
"
,
(
unsigned
)
ntohl
(
fl
->
label
),
fl
->
share
,
(
unsigned
)
fl
->
owner
,
...
...
@@ -645,7 +645,7 @@ static void ip6fl_fl_seq_show(struct seq_file *seq, struct ip6_flowlabel *fl)
static
int
ip6fl_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
if
(
v
==
SEQ_START_TOKEN
)
seq_printf
(
seq
,
"%-5s %-1s %-6s %-6s %-6s %-8s %-3
9
s %s
\n
"
,
seq_printf
(
seq
,
"%-5s %-1s %-6s %-6s %-6s %-8s %-3
2
s %s
\n
"
,
"Label"
,
"S"
,
"Owner"
,
"Users"
,
"Linger"
,
"Expires"
,
"Dst"
,
"Opt"
);
else
ip6fl_fl_seq_show
(
seq
,
v
);
...
...
net/ipv6/mcast.c
View file @
15578eeb
...
...
@@ -2373,7 +2373,7 @@ static int igmp6_mc_seq_show(struct seq_file *seq, void *v)
struct
igmp6_mc_iter_state
*
state
=
igmp6_mc_seq_private
(
seq
);
seq_printf
(
seq
,
"%-4d %-15s "
NIP6_FMT
" %5d %08X %ld
\n
"
,
"%-4d %-15s "
NIP6_
SEQ
FMT
" %5d %08X %ld
\n
"
,
state
->
dev
->
ifindex
,
state
->
dev
->
name
,
NIP6
(
im
->
mca_addr
),
im
->
mca_users
,
im
->
mca_flags
,
...
...
@@ -2542,12 +2542,12 @@ static int igmp6_mcf_seq_show(struct seq_file *seq, void *v)
if
(
v
==
SEQ_START_TOKEN
)
{
seq_printf
(
seq
,
"%3s %6s "
"%3
9s %39
s %6s %6s
\n
"
,
"Idx"
,
"%3
2s %32
s %6s %6s
\n
"
,
"Idx"
,
"Device"
,
"Multicast Address"
,
"Source Address"
,
"INC"
,
"EXC"
);
}
else
{
seq_printf
(
seq
,
"%3d %6.6s "
NIP6_
FMT
" "
NIP6_
FMT
" %6lu %6lu
\n
"
,
"%3d %6.6s "
NIP6_
SEQFMT
" "
NIP6_SEQ
FMT
" %6lu %6lu
\n
"
,
state
->
dev
->
ifindex
,
state
->
dev
->
name
,
NIP6
(
state
->
im
->
mca_addr
),
NIP6
(
psf
->
sf_addr
),
...
...
net/ipv6/netfilter/Makefile
View file @
15578eeb
...
...
@@ -4,7 +4,6 @@
# Link order matters here.
obj-$(CONFIG_IP6_NF_IPTABLES)
+=
ip6_tables.o
obj-$(CONFIG_IP6_NF_MATCH_LENGTH)
+=
ip6t_length.o
obj-$(CONFIG_IP6_NF_MATCH_RT)
+=
ip6t_rt.o
obj-$(CONFIG_IP6_NF_MATCH_OPTS)
+=
ip6t_hbh.o ip6t_dst.o
obj-$(CONFIG_IP6_NF_MATCH_IPV6HEADER)
+=
ip6t_ipv6header.o
...
...
net/ipv6/netfilter/ip6t_dst.c
View file @
15578eeb
...
...
@@ -36,19 +36,19 @@ MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>");
#endif
/*
* (Type & 0xC0) >> 6
*
0 -> ignorable
*
1 -> must drop the packet
*
2 -> send ICMP PARM PROB regardless and drop packet
*
3 -> Send ICMP if not a multicast address and drop packet
*
(Type & 0xC0) >> 6
* 0 -> ignorable
* 1 -> must drop the packet
* 2 -> send ICMP PARM PROB regardless and drop packet
* 3 -> Send ICMP if not a multicast address and drop packet
* (Type & 0x20) >> 5
*
0 -> invariant
*
1 -> can change the routing
* 0 -> invariant
* 1 -> can change the routing
* (Type & 0x1F) Type
*
0 -> Pad1 (only 1 byte!)
*
1 -> PadN LENGTH info (total length = length + 2)
*
C0 | 2 -> JUMBO 4 x x x x ( xxxx > 64k )
*
5 -> RTALERT 2 x x
*
0 -> Pad1 (only 1 byte!)
*
1 -> PadN LENGTH info (total length = length + 2)
*
C0 | 2 -> JUMBO 4 x x x x ( xxxx > 64k )
*
5 -> RTALERT 2 x x
*/
static
int
...
...
@@ -60,16 +60,16 @@ match(const struct sk_buff *skb,
unsigned
int
protoff
,
int
*
hotdrop
)
{
struct
ipv6_opt_hdr
_optsh
,
*
oh
;
const
struct
ip6t_opts
*
optinfo
=
matchinfo
;
unsigned
int
temp
;
unsigned
int
ptr
;
unsigned
int
hdrlen
=
0
;
unsigned
int
ret
=
0
;
u8
_opttype
,
*
tp
=
NULL
;
u8
_optlen
,
*
lp
=
NULL
;
unsigned
int
optlen
;
struct
ipv6_opt_hdr
_optsh
,
*
oh
;
const
struct
ip6t_opts
*
optinfo
=
matchinfo
;
unsigned
int
temp
;
unsigned
int
ptr
;
unsigned
int
hdrlen
=
0
;
unsigned
int
ret
=
0
;
u8
_opttype
,
*
tp
=
NULL
;
u8
_optlen
,
*
lp
=
NULL
;
unsigned
int
optlen
;
#if HOPBYHOP
if
(
ipv6_find_hdr
(
skb
,
&
ptr
,
NEXTHDR_HOP
,
NULL
)
<
0
)
#else
...
...
@@ -77,42 +77,41 @@ match(const struct sk_buff *skb,
#endif
return
0
;
oh
=
skb_header_pointer
(
skb
,
ptr
,
sizeof
(
_optsh
),
&
_optsh
);
if
(
oh
==
NULL
){
*
hotdrop
=
1
;
return
0
;
}
hdrlen
=
ipv6_optlen
(
oh
);
if
(
skb
->
len
-
ptr
<
hdrlen
){
/* Packet smaller than it's length field */
return
0
;
}
DEBUGP
(
"IPv6 OPTS LEN %u %u "
,
hdrlen
,
oh
->
hdrlen
);
DEBUGP
(
"len %02X %04X %02X "
,
optinfo
->
hdrlen
,
hdrlen
,
(
!
(
optinfo
->
flags
&
IP6T_OPTS_LEN
)
||
((
optinfo
->
hdrlen
==
hdrlen
)
^
!!
(
optinfo
->
invflags
&
IP6T_OPTS_INV_LEN
))));
ret
=
(
oh
!=
NULL
)
&&
(
!
(
optinfo
->
flags
&
IP6T_OPTS_LEN
)
||
((
optinfo
->
hdrlen
==
hdrlen
)
^
!!
(
optinfo
->
invflags
&
IP6T_OPTS_INV_LEN
)));
ptr
+=
2
;
hdrlen
-=
2
;
if
(
!
(
optinfo
->
flags
&
IP6T_OPTS_OPTS
)
){
return
ret
;
oh
=
skb_header_pointer
(
skb
,
ptr
,
sizeof
(
_optsh
),
&
_optsh
);
if
(
oh
==
NULL
)
{
*
hotdrop
=
1
;
return
0
;
}
hdrlen
=
ipv6_optlen
(
oh
);
if
(
skb
->
len
-
ptr
<
hdrlen
)
{
/* Packet smaller than it's length field */
return
0
;
}
DEBUGP
(
"IPv6 OPTS LEN %u %u "
,
hdrlen
,
oh
->
hdrlen
);
DEBUGP
(
"len %02X %04X %02X "
,
optinfo
->
hdrlen
,
hdrlen
,
(
!
(
optinfo
->
flags
&
IP6T_OPTS_LEN
)
||
((
optinfo
->
hdrlen
==
hdrlen
)
^
!!
(
optinfo
->
invflags
&
IP6T_OPTS_INV_LEN
))));
ret
=
(
oh
!=
NULL
)
&&
(
!
(
optinfo
->
flags
&
IP6T_OPTS_LEN
)
||
((
optinfo
->
hdrlen
==
hdrlen
)
^
!!
(
optinfo
->
invflags
&
IP6T_OPTS_INV_LEN
)));
ptr
+=
2
;
hdrlen
-=
2
;
if
(
!
(
optinfo
->
flags
&
IP6T_OPTS_OPTS
))
{
return
ret
;
}
else
if
(
optinfo
->
flags
&
IP6T_OPTS_NSTRICT
)
{
DEBUGP
(
"Not strict - not implemented"
);
}
else
{
DEBUGP
(
"Strict "
);
DEBUGP
(
"#%d "
,
optinfo
->
optsnr
);
for
(
temp
=
0
;
temp
<
optinfo
->
optsnr
;
temp
++
)
{
DEBUGP
(
"#%d "
,
optinfo
->
optsnr
);
for
(
temp
=
0
;
temp
<
optinfo
->
optsnr
;
temp
++
)
{
/* type field exists ? */
if
(
hdrlen
<
1
)
break
;
...
...
@@ -122,10 +121,10 @@ match(const struct sk_buff *skb,
break
;
/* Type check */
if
(
*
tp
!=
(
optinfo
->
opts
[
temp
]
&
0xFF00
)
>>
8
)
{
if
(
*
tp
!=
(
optinfo
->
opts
[
temp
]
&
0xFF00
)
>>
8
)
{
DEBUGP
(
"Tbad %02X %02X
\n
"
,
*
tp
,
(
optinfo
->
opts
[
temp
]
&
0xFF00
)
>>
8
);
(
optinfo
->
opts
[
temp
]
&
0xFF00
)
>>
8
);
return
0
;
}
else
{
DEBUGP
(
"Tok "
);
...
...
@@ -169,7 +168,8 @@ match(const struct sk_buff *skb,
}
if
(
temp
==
optinfo
->
optsnr
)
return
ret
;
else
return
0
;
else
return
0
;
}
return
0
;
...
...
@@ -178,25 +178,24 @@ match(const struct sk_buff *skb,
/* Called when user tries to insert an entry of this type. */
static
int
checkentry
(
const
char
*
tablename
,
const
void
*
info
,
void
*
matchinfo
,
unsigned
int
matchinfosize
,
unsigned
int
hook_mask
)
const
void
*
info
,
void
*
matchinfo
,
unsigned
int
matchinfosize
,
unsigned
int
hook_mask
)
{
const
struct
ip6t_opts
*
optsinfo
=
matchinfo
;
if
(
matchinfosize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_opts
)))
{
DEBUGP
(
"ip6t_opts: matchsize %u != %u
\n
"
,
matchinfosize
,
IP6T_ALIGN
(
sizeof
(
struct
ip6t_opts
)));
return
0
;
}
if
(
optsinfo
->
invflags
&
~
IP6T_OPTS_INV_MASK
)
{
DEBUGP
(
"ip6t_opts: unknown flags %X
\n
"
,
optsinfo
->
invflags
);
return
0
;
}
return
1
;
const
struct
ip6t_opts
*
optsinfo
=
matchinfo
;
if
(
matchinfosize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_opts
)))
{
DEBUGP
(
"ip6t_opts: matchsize %u != %u
\n
"
,
matchinfosize
,
IP6T_ALIGN
(
sizeof
(
struct
ip6t_opts
)));
return
0
;
}
if
(
optsinfo
->
invflags
&
~
IP6T_OPTS_INV_MASK
)
{
DEBUGP
(
"ip6t_opts: unknown flags %X
\n
"
,
optsinfo
->
invflags
);
return
0
;
}
return
1
;
}
static
struct
ip6t_match
opts_match
=
{
...
...
@@ -212,12 +211,12 @@ static struct ip6t_match opts_match = {
static
int
__init
init
(
void
)
{
return
ip6t_register_match
(
&
opts_match
);
return
ip6t_register_match
(
&
opts_match
);
}
static
void
__exit
cleanup
(
void
)
{
ip6t_unregister_match
(
&
opts_match
);
ip6t_unregister_match
(
&
opts_match
);
}
module_init
(
init
);
...
...
net/ipv6/netfilter/ip6t_eui64.c
View file @
15578eeb
...
...
@@ -27,45 +27,45 @@ match(const struct sk_buff *skb,
unsigned
int
protoff
,
int
*
hotdrop
)
{
unsigned
char
eui64
[
8
];
int
i
=
0
;
unsigned
char
eui64
[
8
];
int
i
=
0
;
if
(
!
(
skb
->
mac
.
raw
>=
skb
->
head
&&
(
skb
->
mac
.
raw
+
ETH_HLEN
)
<=
skb
->
data
)
&&
offset
!=
0
)
{
*
hotdrop
=
1
;
return
0
;
}
memset
(
eui64
,
0
,
sizeof
(
eui64
));
if
(
eth_hdr
(
skb
)
->
h_proto
==
ntohs
(
ETH_P_IPV6
))
{
if
(
skb
->
nh
.
ipv6h
->
version
==
0x6
)
{
memcpy
(
eui64
,
eth_hdr
(
skb
)
->
h_source
,
3
);
memcpy
(
eui64
+
5
,
eth_hdr
(
skb
)
->
h_source
+
3
,
3
);
eui64
[
3
]
=
0xff
;
eui64
[
4
]
=
0xfe
;
eui64
[
0
]
|=
0x02
;
i
=
0
;
while
((
skb
->
nh
.
ipv6h
->
saddr
.
s6_addr
[
8
+
i
]
==
eui64
[
i
])
&&
(
i
<
8
))
i
++
;
if
(
i
==
8
)
return
1
;
}
}
return
0
;
if
(
!
(
skb
->
mac
.
raw
>=
skb
->
head
&&
(
skb
->
mac
.
raw
+
ETH_HLEN
)
<=
skb
->
data
)
&&
offset
!=
0
)
{
*
hotdrop
=
1
;
return
0
;
}
memset
(
eui64
,
0
,
sizeof
(
eui64
));
if
(
eth_hdr
(
skb
)
->
h_proto
==
ntohs
(
ETH_P_IPV6
))
{
if
(
skb
->
nh
.
ipv6h
->
version
==
0x6
)
{
memcpy
(
eui64
,
eth_hdr
(
skb
)
->
h_source
,
3
);
memcpy
(
eui64
+
5
,
eth_hdr
(
skb
)
->
h_source
+
3
,
3
);
eui64
[
3
]
=
0xff
;
eui64
[
4
]
=
0xfe
;
eui64
[
0
]
|=
0x02
;
i
=
0
;
while
((
skb
->
nh
.
ipv6h
->
saddr
.
s6_addr
[
8
+
i
]
==
eui64
[
i
])
&&
(
i
<
8
))
i
++
;
if
(
i
==
8
)
return
1
;
}
}
return
0
;
}
static
int
ip6t_eui64_checkentry
(
const
char
*
tablename
,
const
void
*
ip
,
void
*
matchinfo
,
unsigned
int
matchsize
,
unsigned
int
hook_mask
)
const
void
*
ip
,
void
*
matchinfo
,
unsigned
int
matchsize
,
unsigned
int
hook_mask
)
{
if
(
hook_mask
&
~
((
1
<<
NF_IP6_PRE_ROUTING
)
|
(
1
<<
NF_IP6_LOCAL_IN
)
|
...
...
net/ipv6/netfilter/ip6t_frag.c
View file @
15578eeb
...
...
@@ -31,12 +31,12 @@ MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>");
static
inline
int
id_match
(
u_int32_t
min
,
u_int32_t
max
,
u_int32_t
id
,
int
invert
)
{
int
r
=
0
;
DEBUGP
(
"frag id_match:%c 0x%x <= 0x%x <= 0x%x"
,
invert
?
'!'
:
' '
,
min
,
id
,
max
);
r
=
(
id
>=
min
&&
id
<=
max
)
^
invert
;
DEBUGP
(
" result %s
\n
"
,
r
?
"PASS"
:
"FAILED"
);
return
r
;
int
r
=
0
;
DEBUGP
(
"frag id_match:%c 0x%x <= 0x%x <= 0x%x"
,
invert
?
'!'
:
' '
,
min
,
id
,
max
);
r
=
(
id
>=
min
&&
id
<=
max
)
^
invert
;
DEBUGP
(
" result %s
\n
"
,
r
?
"PASS"
:
"FAILED"
);
return
r
;
}
static
int
...
...
@@ -48,92 +48,91 @@ match(const struct sk_buff *skb,
unsigned
int
protoff
,
int
*
hotdrop
)
{
struct
frag_hdr
_frag
,
*
fh
;
const
struct
ip6t_frag
*
fraginfo
=
matchinfo
;
unsigned
int
ptr
;
struct
frag_hdr
_frag
,
*
fh
;
const
struct
ip6t_frag
*
fraginfo
=
matchinfo
;
unsigned
int
ptr
;
if
(
ipv6_find_hdr
(
skb
,
&
ptr
,
NEXTHDR_FRAGMENT
,
NULL
)
<
0
)
return
0
;
fh
=
skb_header_pointer
(
skb
,
ptr
,
sizeof
(
_frag
),
&
_frag
);
if
(
fh
==
NULL
){
if
(
fh
==
NULL
)
{
*
hotdrop
=
1
;
return
0
;
}
DEBUGP
(
"INFO %04X "
,
fh
->
frag_off
);
DEBUGP
(
"OFFSET %04X "
,
ntohs
(
fh
->
frag_off
)
&
~
0x7
);
DEBUGP
(
"RES %02X %04X"
,
fh
->
reserved
,
ntohs
(
fh
->
frag_off
)
&
0x6
);
DEBUGP
(
"MF %04X "
,
fh
->
frag_off
&
htons
(
IP6_MF
));
DEBUGP
(
"ID %u %08X
\n
"
,
ntohl
(
fh
->
identification
),
ntohl
(
fh
->
identification
));
DEBUGP
(
"IPv6 FRAG id %02X "
,
(
id_match
(
fraginfo
->
ids
[
0
],
fraginfo
->
ids
[
1
],
ntohl
(
fh
->
identification
),
!!
(
fraginfo
->
invflags
&
IP6T_FRAG_INV_IDS
))));
DEBUGP
(
"res %02X %02X%04X %02X "
,
(
fraginfo
->
flags
&
IP6T_FRAG_RES
),
fh
->
reserved
,
ntohs
(
fh
->
frag_off
)
&
0x6
,
!
((
fraginfo
->
flags
&
IP6T_FRAG_RES
)
&&
(
fh
->
reserved
||
(
ntohs
(
fh
->
frag_off
)
&
0x06
))));
DEBUGP
(
"first %02X %02X %02X "
,
(
fraginfo
->
flags
&
IP6T_FRAG_FST
),
ntohs
(
fh
->
frag_off
)
&
~
0x7
,
!
((
fraginfo
->
flags
&
IP6T_FRAG_FST
)
&&
(
ntohs
(
fh
->
frag_off
)
&
~
0x7
)));
DEBUGP
(
"mf %02X %02X %02X "
,
(
fraginfo
->
flags
&
IP6T_FRAG_MF
),
ntohs
(
fh
->
frag_off
)
&
IP6_MF
,
!
((
fraginfo
->
flags
&
IP6T_FRAG_MF
)
&&
!
((
ntohs
(
fh
->
frag_off
)
&
IP6_MF
))));
DEBUGP
(
"last %02X %02X %02X
\n
"
,
(
fraginfo
->
flags
&
IP6T_FRAG_NMF
),
ntohs
(
fh
->
frag_off
)
&
IP6_MF
,
!
((
fraginfo
->
flags
&
IP6T_FRAG_NMF
)
&&
(
ntohs
(
fh
->
frag_off
)
&
IP6_MF
)));
return
(
fh
!=
NULL
)
&&
(
id_match
(
fraginfo
->
ids
[
0
],
fraginfo
->
ids
[
1
],
ntohl
(
fh
->
identification
),
!!
(
fraginfo
->
invflags
&
IP6T_FRAG_INV_IDS
)))
&&
!
((
fraginfo
->
flags
&
IP6T_FRAG_RES
)
&&
(
fh
->
reserved
||
(
ntohs
(
fh
->
frag_off
)
&
0x6
)))
&&
!
((
fraginfo
->
flags
&
IP6T_FRAG_FST
)
&&
(
ntohs
(
fh
->
frag_off
)
&
~
0x7
))
&&
!
((
fraginfo
->
flags
&
IP6T_FRAG_MF
)
&&
!
(
ntohs
(
fh
->
frag_off
)
&
IP6_MF
))
&&
!
((
fraginfo
->
flags
&
IP6T_FRAG_NMF
)
&&
(
ntohs
(
fh
->
frag_off
)
&
IP6_MF
));
DEBUGP
(
"INFO %04X "
,
fh
->
frag_off
);
DEBUGP
(
"OFFSET %04X "
,
ntohs
(
fh
->
frag_off
)
&
~
0x7
);
DEBUGP
(
"RES %02X %04X"
,
fh
->
reserved
,
ntohs
(
fh
->
frag_off
)
&
0x6
);
DEBUGP
(
"MF %04X "
,
fh
->
frag_off
&
htons
(
IP6_MF
));
DEBUGP
(
"ID %u %08X
\n
"
,
ntohl
(
fh
->
identification
),
ntohl
(
fh
->
identification
));
DEBUGP
(
"IPv6 FRAG id %02X "
,
(
id_match
(
fraginfo
->
ids
[
0
],
fraginfo
->
ids
[
1
],
ntohl
(
fh
->
identification
),
!!
(
fraginfo
->
invflags
&
IP6T_FRAG_INV_IDS
))));
DEBUGP
(
"res %02X %02X%04X %02X "
,
(
fraginfo
->
flags
&
IP6T_FRAG_RES
),
fh
->
reserved
,
ntohs
(
fh
->
frag_off
)
&
0x6
,
!
((
fraginfo
->
flags
&
IP6T_FRAG_RES
)
&&
(
fh
->
reserved
||
(
ntohs
(
fh
->
frag_off
)
&
0x06
))));
DEBUGP
(
"first %02X %02X %02X "
,
(
fraginfo
->
flags
&
IP6T_FRAG_FST
),
ntohs
(
fh
->
frag_off
)
&
~
0x7
,
!
((
fraginfo
->
flags
&
IP6T_FRAG_FST
)
&&
(
ntohs
(
fh
->
frag_off
)
&
~
0x7
)));
DEBUGP
(
"mf %02X %02X %02X "
,
(
fraginfo
->
flags
&
IP6T_FRAG_MF
),
ntohs
(
fh
->
frag_off
)
&
IP6_MF
,
!
((
fraginfo
->
flags
&
IP6T_FRAG_MF
)
&&
!
((
ntohs
(
fh
->
frag_off
)
&
IP6_MF
))));
DEBUGP
(
"last %02X %02X %02X
\n
"
,
(
fraginfo
->
flags
&
IP6T_FRAG_NMF
),
ntohs
(
fh
->
frag_off
)
&
IP6_MF
,
!
((
fraginfo
->
flags
&
IP6T_FRAG_NMF
)
&&
(
ntohs
(
fh
->
frag_off
)
&
IP6_MF
)));
return
(
fh
!=
NULL
)
&&
(
id_match
(
fraginfo
->
ids
[
0
],
fraginfo
->
ids
[
1
],
ntohl
(
fh
->
identification
),
!!
(
fraginfo
->
invflags
&
IP6T_FRAG_INV_IDS
)))
&&
!
((
fraginfo
->
flags
&
IP6T_FRAG_RES
)
&&
(
fh
->
reserved
||
(
ntohs
(
fh
->
frag_off
)
&
0x6
)))
&&
!
((
fraginfo
->
flags
&
IP6T_FRAG_FST
)
&&
(
ntohs
(
fh
->
frag_off
)
&
~
0x7
))
&&
!
((
fraginfo
->
flags
&
IP6T_FRAG_MF
)
&&
!
(
ntohs
(
fh
->
frag_off
)
&
IP6_MF
))
&&
!
((
fraginfo
->
flags
&
IP6T_FRAG_NMF
)
&&
(
ntohs
(
fh
->
frag_off
)
&
IP6_MF
));
}
/* Called when user tries to insert an entry of this type. */
static
int
checkentry
(
const
char
*
tablename
,
const
void
*
ip
,
void
*
matchinfo
,
unsigned
int
matchinfosize
,
unsigned
int
hook_mask
)
const
void
*
ip
,
void
*
matchinfo
,
unsigned
int
matchinfosize
,
unsigned
int
hook_mask
)
{
const
struct
ip6t_frag
*
fraginfo
=
matchinfo
;
if
(
matchinfosize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_frag
)))
{
DEBUGP
(
"ip6t_frag: matchsize %u != %u
\n
"
,
matchinfosize
,
IP6T_ALIGN
(
sizeof
(
struct
ip6t_frag
)));
return
0
;
}
if
(
fraginfo
->
invflags
&
~
IP6T_FRAG_INV_MASK
)
{
DEBUGP
(
"ip6t_frag: unknown flags %X
\n
"
,
fraginfo
->
invflags
);
return
0
;
}
return
1
;
const
struct
ip6t_frag
*
fraginfo
=
matchinfo
;
if
(
matchinfosize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_frag
)))
{
DEBUGP
(
"ip6t_frag: matchsize %u != %u
\n
"
,
matchinfosize
,
IP6T_ALIGN
(
sizeof
(
struct
ip6t_frag
)));
return
0
;
}
if
(
fraginfo
->
invflags
&
~
IP6T_FRAG_INV_MASK
)
{
DEBUGP
(
"ip6t_frag: unknown flags %X
\n
"
,
fraginfo
->
invflags
);
return
0
;
}
return
1
;
}
static
struct
ip6t_match
frag_match
=
{
...
...
@@ -145,12 +144,12 @@ static struct ip6t_match frag_match = {
static
int
__init
init
(
void
)
{
return
ip6t_register_match
(
&
frag_match
);
return
ip6t_register_match
(
&
frag_match
);
}
static
void
__exit
cleanup
(
void
)
{
ip6t_unregister_match
(
&
frag_match
);
ip6t_unregister_match
(
&
frag_match
);
}
module_init
(
init
);
...
...
net/ipv6/netfilter/ip6t_hbh.c
View file @
15578eeb
...
...
@@ -36,19 +36,19 @@ MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>");
#endif
/*
* (Type & 0xC0) >> 6
*
0 -> ignorable
*
1 -> must drop the packet
*
2 -> send ICMP PARM PROB regardless and drop packet
*
3 -> Send ICMP if not a multicast address and drop packet
*
(Type & 0xC0) >> 6
* 0 -> ignorable
* 1 -> must drop the packet
* 2 -> send ICMP PARM PROB regardless and drop packet
* 3 -> Send ICMP if not a multicast address and drop packet
* (Type & 0x20) >> 5
*
0 -> invariant
*
1 -> can change the routing
* 0 -> invariant
* 1 -> can change the routing
* (Type & 0x1F) Type
*
0 -> Pad1 (only 1 byte!)
*
1 -> PadN LENGTH info (total length = length + 2)
*
C0 | 2 -> JUMBO 4 x x x x ( xxxx > 64k )
*
5 -> RTALERT 2 x x
*
0 -> Pad1 (only 1 byte!)
*
1 -> PadN LENGTH info (total length = length + 2)
*
C0 | 2 -> JUMBO 4 x x x x ( xxxx > 64k )
*
5 -> RTALERT 2 x x
*/
static
int
...
...
@@ -60,16 +60,16 @@ match(const struct sk_buff *skb,
unsigned
int
protoff
,
int
*
hotdrop
)
{
struct
ipv6_opt_hdr
_optsh
,
*
oh
;
const
struct
ip6t_opts
*
optinfo
=
matchinfo
;
unsigned
int
temp
;
unsigned
int
ptr
;
unsigned
int
hdrlen
=
0
;
unsigned
int
ret
=
0
;
u8
_opttype
,
*
tp
=
NULL
;
u8
_optlen
,
*
lp
=
NULL
;
unsigned
int
optlen
;
struct
ipv6_opt_hdr
_optsh
,
*
oh
;
const
struct
ip6t_opts
*
optinfo
=
matchinfo
;
unsigned
int
temp
;
unsigned
int
ptr
;
unsigned
int
hdrlen
=
0
;
unsigned
int
ret
=
0
;
u8
_opttype
,
*
tp
=
NULL
;
u8
_optlen
,
*
lp
=
NULL
;
unsigned
int
optlen
;
#if HOPBYHOP
if
(
ipv6_find_hdr
(
skb
,
&
ptr
,
NEXTHDR_HOP
,
NULL
)
<
0
)
#else
...
...
@@ -77,42 +77,41 @@ match(const struct sk_buff *skb,
#endif
return
0
;
oh
=
skb_header_pointer
(
skb
,
ptr
,
sizeof
(
_optsh
),
&
_optsh
);
if
(
oh
==
NULL
){
*
hotdrop
=
1
;
return
0
;
}
hdrlen
=
ipv6_optlen
(
oh
);
if
(
skb
->
len
-
ptr
<
hdrlen
){
/* Packet smaller than it's length field */
return
0
;
}
DEBUGP
(
"IPv6 OPTS LEN %u %u "
,
hdrlen
,
oh
->
hdrlen
);
DEBUGP
(
"len %02X %04X %02X "
,
optinfo
->
hdrlen
,
hdrlen
,
(
!
(
optinfo
->
flags
&
IP6T_OPTS_LEN
)
||
((
optinfo
->
hdrlen
==
hdrlen
)
^
!!
(
optinfo
->
invflags
&
IP6T_OPTS_INV_LEN
))));
ret
=
(
oh
!=
NULL
)
&&
(
!
(
optinfo
->
flags
&
IP6T_OPTS_LEN
)
||
((
optinfo
->
hdrlen
==
hdrlen
)
^
!!
(
optinfo
->
invflags
&
IP6T_OPTS_INV_LEN
)));
ptr
+=
2
;
hdrlen
-=
2
;
if
(
!
(
optinfo
->
flags
&
IP6T_OPTS_OPTS
)
){
return
ret
;
oh
=
skb_header_pointer
(
skb
,
ptr
,
sizeof
(
_optsh
),
&
_optsh
);
if
(
oh
==
NULL
)
{
*
hotdrop
=
1
;
return
0
;
}
hdrlen
=
ipv6_optlen
(
oh
);
if
(
skb
->
len
-
ptr
<
hdrlen
)
{
/* Packet smaller than it's length field */
return
0
;
}
DEBUGP
(
"IPv6 OPTS LEN %u %u "
,
hdrlen
,
oh
->
hdrlen
);
DEBUGP
(
"len %02X %04X %02X "
,
optinfo
->
hdrlen
,
hdrlen
,
(
!
(
optinfo
->
flags
&
IP6T_OPTS_LEN
)
||
((
optinfo
->
hdrlen
==
hdrlen
)
^
!!
(
optinfo
->
invflags
&
IP6T_OPTS_INV_LEN
))));
ret
=
(
oh
!=
NULL
)
&&
(
!
(
optinfo
->
flags
&
IP6T_OPTS_LEN
)
||
((
optinfo
->
hdrlen
==
hdrlen
)
^
!!
(
optinfo
->
invflags
&
IP6T_OPTS_INV_LEN
)));
ptr
+=
2
;
hdrlen
-=
2
;
if
(
!
(
optinfo
->
flags
&
IP6T_OPTS_OPTS
))
{
return
ret
;
}
else
if
(
optinfo
->
flags
&
IP6T_OPTS_NSTRICT
)
{
DEBUGP
(
"Not strict - not implemented"
);
}
else
{
DEBUGP
(
"Strict "
);
DEBUGP
(
"#%d "
,
optinfo
->
optsnr
);
for
(
temp
=
0
;
temp
<
optinfo
->
optsnr
;
temp
++
)
{
DEBUGP
(
"#%d "
,
optinfo
->
optsnr
);
for
(
temp
=
0
;
temp
<
optinfo
->
optsnr
;
temp
++
)
{
/* type field exists ? */
if
(
hdrlen
<
1
)
break
;
...
...
@@ -122,10 +121,10 @@ match(const struct sk_buff *skb,
break
;
/* Type check */
if
(
*
tp
!=
(
optinfo
->
opts
[
temp
]
&
0xFF00
)
>>
8
)
{
if
(
*
tp
!=
(
optinfo
->
opts
[
temp
]
&
0xFF00
)
>>
8
)
{
DEBUGP
(
"Tbad %02X %02X
\n
"
,
*
tp
,
(
optinfo
->
opts
[
temp
]
&
0xFF00
)
>>
8
);
(
optinfo
->
opts
[
temp
]
&
0xFF00
)
>>
8
);
return
0
;
}
else
{
DEBUGP
(
"Tok "
);
...
...
@@ -169,7 +168,8 @@ match(const struct sk_buff *skb,
}
if
(
temp
==
optinfo
->
optsnr
)
return
ret
;
else
return
0
;
else
return
0
;
}
return
0
;
...
...
@@ -178,25 +178,24 @@ match(const struct sk_buff *skb,
/* Called when user tries to insert an entry of this type. */
static
int
checkentry
(
const
char
*
tablename
,
const
void
*
entry
,
void
*
matchinfo
,
unsigned
int
matchinfosize
,
unsigned
int
hook_mask
)
const
void
*
entry
,
void
*
matchinfo
,
unsigned
int
matchinfosize
,
unsigned
int
hook_mask
)
{
const
struct
ip6t_opts
*
optsinfo
=
matchinfo
;
if
(
matchinfosize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_opts
)))
{
DEBUGP
(
"ip6t_opts: matchsize %u != %u
\n
"
,
matchinfosize
,
IP6T_ALIGN
(
sizeof
(
struct
ip6t_opts
)));
return
0
;
}
if
(
optsinfo
->
invflags
&
~
IP6T_OPTS_INV_MASK
)
{
DEBUGP
(
"ip6t_opts: unknown flags %X
\n
"
,
optsinfo
->
invflags
);
return
0
;
}
return
1
;
const
struct
ip6t_opts
*
optsinfo
=
matchinfo
;
if
(
matchinfosize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_opts
)))
{
DEBUGP
(
"ip6t_opts: matchsize %u != %u
\n
"
,
matchinfosize
,
IP6T_ALIGN
(
sizeof
(
struct
ip6t_opts
)));
return
0
;
}
if
(
optsinfo
->
invflags
&
~
IP6T_OPTS_INV_MASK
)
{
DEBUGP
(
"ip6t_opts: unknown flags %X
\n
"
,
optsinfo
->
invflags
);
return
0
;
}
return
1
;
}
static
struct
ip6t_match
opts_match
=
{
...
...
@@ -212,12 +211,12 @@ static struct ip6t_match opts_match = {
static
int
__init
init
(
void
)
{
return
ip6t_register_match
(
&
opts_match
);
return
ip6t_register_match
(
&
opts_match
);
}
static
void
__exit
cleanup
(
void
)
{
ip6t_unregister_match
(
&
opts_match
);
ip6t_unregister_match
(
&
opts_match
);
}
module_init
(
init
);
...
...
net/ipv6/netfilter/ip6t_ipv6header.c
View file @
15578eeb
...
...
@@ -50,20 +50,20 @@ ipv6header_match(const struct sk_buff *skb,
len
=
skb
->
len
-
ptr
;
temp
=
0
;
while
(
ip6t_ext_hdr
(
nexthdr
))
{
while
(
ip6t_ext_hdr
(
nexthdr
))
{
struct
ipv6_opt_hdr
_hdr
,
*
hp
;
int
hdrlen
;
int
hdrlen
;
/* Is there enough space for the next ext header? */
if
(
len
<
(
int
)
sizeof
(
struct
ipv6_opt_hdr
))
return
0
;
if
(
len
<
(
int
)
sizeof
(
struct
ipv6_opt_hdr
))
return
0
;
/* No more exthdr -> evaluate */
if
(
nexthdr
==
NEXTHDR_NONE
)
{
if
(
nexthdr
==
NEXTHDR_NONE
)
{
temp
|=
MASK_NONE
;
break
;
}
/* ESP -> evaluate */
if
(
nexthdr
==
NEXTHDR_ESP
)
{
if
(
nexthdr
==
NEXTHDR_ESP
)
{
temp
|=
MASK_ESP
;
break
;
}
...
...
@@ -72,43 +72,43 @@ ipv6header_match(const struct sk_buff *skb,
BUG_ON
(
hp
==
NULL
);
/* Calculate the header length */
if
(
nexthdr
==
NEXTHDR_FRAGMENT
)
{
hdrlen
=
8
;
}
else
if
(
nexthdr
==
NEXTHDR_AUTH
)
hdrlen
=
(
hp
->
hdrlen
+
2
)
<<
2
;
else
hdrlen
=
ipv6_optlen
(
hp
);
if
(
nexthdr
==
NEXTHDR_FRAGMENT
)
{
hdrlen
=
8
;
}
else
if
(
nexthdr
==
NEXTHDR_AUTH
)
hdrlen
=
(
hp
->
hdrlen
+
2
)
<<
2
;
else
hdrlen
=
ipv6_optlen
(
hp
);
/* set the flag */
switch
(
nexthdr
){
case
NEXTHDR_HOP
:
temp
|=
MASK_HOPOPTS
;
break
;
case
NEXTHDR_ROUTING
:
temp
|=
MASK_ROUTING
;
break
;
case
NEXTHDR_FRAGMENT
:
temp
|=
MASK_FRAGMENT
;
break
;
case
NEXTHDR_AUTH
:
temp
|=
MASK_AH
;
break
;
case
NEXTHDR_DEST
:
temp
|=
MASK_DSTOPTS
;
break
;
default:
return
0
;
break
;
switch
(
nexthdr
)
{
case
NEXTHDR_HOP
:
temp
|=
MASK_HOPOPTS
;
break
;
case
NEXTHDR_ROUTING
:
temp
|=
MASK_ROUTING
;
break
;
case
NEXTHDR_FRAGMENT
:
temp
|=
MASK_FRAGMENT
;
break
;
case
NEXTHDR_AUTH
:
temp
|=
MASK_AH
;
break
;
case
NEXTHDR_DEST
:
temp
|=
MASK_DSTOPTS
;
break
;
default:
return
0
;
break
;
}
nexthdr
=
hp
->
nexthdr
;
len
-=
hdrlen
;
ptr
+=
hdrlen
;
nexthdr
=
hp
->
nexthdr
;
len
-=
hdrlen
;
ptr
+=
hdrlen
;
if
(
ptr
>
skb
->
len
)
break
;
}
}
if
(
(
nexthdr
!=
NEXTHDR_NONE
)
&&
(
nexthdr
!=
NEXTHDR_ESP
)
)
if
(
(
nexthdr
!=
NEXTHDR_NONE
)
&&
(
nexthdr
!=
NEXTHDR_ESP
)
)
temp
|=
MASK_PROTO
;
if
(
info
->
modeflag
)
...
...
@@ -137,8 +137,8 @@ ipv6header_checkentry(const char *tablename,
return
0
;
/* invflags is 0 or 0xff in hard mode */
if
((
!
info
->
modeflag
)
&&
info
->
invflags
!=
0x00
&&
info
->
invflags
!=
0xFF
)
if
((
!
info
->
modeflag
)
&&
info
->
invflags
!=
0x00
&&
info
->
invflags
!=
0xFF
)
return
0
;
return
1
;
...
...
@@ -152,7 +152,7 @@ static struct ip6t_match ip6t_ipv6header_match = {
.
me
=
THIS_MODULE
,
};
static
int
__init
ipv6header_init
(
void
)
static
int
__init
ipv6header_init
(
void
)
{
return
ip6t_register_match
(
&
ip6t_ipv6header_match
);
}
...
...
@@ -164,4 +164,3 @@ static void __exit ipv6header_exit(void)
module_init
(
ipv6header_init
);
module_exit
(
ipv6header_exit
);
net/ipv6/netfilter/ip6t_owner.c
View file @
15578eeb
...
...
@@ -36,14 +36,14 @@ match(const struct sk_buff *skb,
if
(
!
skb
->
sk
||
!
skb
->
sk
->
sk_socket
||
!
skb
->
sk
->
sk_socket
->
file
)
return
0
;
if
(
info
->
match
&
IP6T_OWNER_UID
)
{
if
((
skb
->
sk
->
sk_socket
->
file
->
f_uid
!=
info
->
uid
)
^
if
(
info
->
match
&
IP6T_OWNER_UID
)
{
if
((
skb
->
sk
->
sk_socket
->
file
->
f_uid
!=
info
->
uid
)
^
!!
(
info
->
invert
&
IP6T_OWNER_UID
))
return
0
;
}
if
(
info
->
match
&
IP6T_OWNER_GID
)
{
if
((
skb
->
sk
->
sk_socket
->
file
->
f_gid
!=
info
->
gid
)
^
if
(
info
->
match
&
IP6T_OWNER_GID
)
{
if
((
skb
->
sk
->
sk_socket
->
file
->
f_gid
!=
info
->
gid
)
^
!!
(
info
->
invert
&
IP6T_OWNER_GID
))
return
0
;
}
...
...
@@ -53,23 +53,23 @@ match(const struct sk_buff *skb,
static
int
checkentry
(
const
char
*
tablename
,
const
void
*
ip
,
void
*
matchinfo
,
unsigned
int
matchsize
,
unsigned
int
hook_mask
)
const
void
*
ip
,
void
*
matchinfo
,
unsigned
int
matchsize
,
unsigned
int
hook_mask
)
{
const
struct
ip6t_owner_info
*
info
=
matchinfo
;
if
(
hook_mask
&
~
((
1
<<
NF_IP6_LOCAL_OUT
)
|
(
1
<<
NF_IP6_POST_ROUTING
)))
{
printk
(
"ip6t_owner: only valid for LOCAL_OUT or POST_ROUTING.
\n
"
);
return
0
;
}
if
(
hook_mask
&
~
((
1
<<
NF_IP6_LOCAL_OUT
)
|
(
1
<<
NF_IP6_POST_ROUTING
)))
{
printk
(
"ip6t_owner: only valid for LOCAL_OUT or POST_ROUTING.
\n
"
);
return
0
;
}
if
(
matchsize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_owner_info
)))
return
0
;
if
(
info
->
match
&
(
IP6T_OWNER_PID
|
IP6T_OWNER_SID
))
{
if
(
info
->
match
&
(
IP6T_OWNER_PID
|
IP6T_OWNER_SID
))
{
printk
(
"ipt_owner: pid and sid matching "
"not supported anymore
\n
"
);
return
0
;
...
...
net/ipv6/netfilter/ip6t_policy.c
View file @
15578eeb
...
...
@@ -118,7 +118,7 @@ static int match(const struct sk_buff *skb,
return
ret
;
}
static
int
checkentry
(
const
char
*
tablename
,
const
struct
ip6t_ip6
*
ip
,
static
int
checkentry
(
const
char
*
tablename
,
const
void
*
ip_void
,
void
*
matchinfo
,
unsigned
int
matchsize
,
unsigned
int
hook_mask
)
{
...
...
net/ipv6/netfilter/ip6t_rt.c
View file @
15578eeb
...
...
@@ -33,12 +33,12 @@ MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>");
static
inline
int
segsleft_match
(
u_int32_t
min
,
u_int32_t
max
,
u_int32_t
id
,
int
invert
)
{
int
r
=
0
;
DEBUGP
(
"rt segsleft_match:%c 0x%x <= 0x%x <= 0x%x"
,
invert
?
'!'
:
' '
,
min
,
id
,
max
);
r
=
(
id
>=
min
&&
id
<=
max
)
^
invert
;
DEBUGP
(
" result %s
\n
"
,
r
?
"PASS"
:
"FAILED"
);
return
r
;
int
r
=
0
;
DEBUGP
(
"rt segsleft_match:%c 0x%x <= 0x%x <= 0x%x"
,
invert
?
'!'
:
' '
,
min
,
id
,
max
);
r
=
(
id
>=
min
&&
id
<=
max
)
^
invert
;
DEBUGP
(
" result %s
\n
"
,
r
?
"PASS"
:
"FAILED"
);
return
r
;
}
static
int
...
...
@@ -50,87 +50,93 @@ match(const struct sk_buff *skb,
unsigned
int
protoff
,
int
*
hotdrop
)
{
struct
ipv6_rt_hdr
_route
,
*
rh
;
const
struct
ip6t_rt
*
rtinfo
=
matchinfo
;
unsigned
int
temp
;
unsigned
int
ptr
;
unsigned
int
hdrlen
=
0
;
unsigned
int
ret
=
0
;
struct
in6_addr
*
ap
,
_addr
;
struct
ipv6_rt_hdr
_route
,
*
rh
;
const
struct
ip6t_rt
*
rtinfo
=
matchinfo
;
unsigned
int
temp
;
unsigned
int
ptr
;
unsigned
int
hdrlen
=
0
;
unsigned
int
ret
=
0
;
struct
in6_addr
*
ap
,
_addr
;
if
(
ipv6_find_hdr
(
skb
,
&
ptr
,
NEXTHDR_ROUTING
,
NULL
)
<
0
)
return
0
;
rh
=
skb_header_pointer
(
skb
,
ptr
,
sizeof
(
_route
),
&
_route
);
if
(
rh
==
NULL
){
*
hotdrop
=
1
;
return
0
;
}
hdrlen
=
ipv6_optlen
(
rh
);
if
(
skb
->
len
-
ptr
<
hdrlen
){
/* Pcket smaller than its length field */
return
0
;
}
DEBUGP
(
"IPv6 RT LEN %u %u "
,
hdrlen
,
rh
->
hdrlen
);
DEBUGP
(
"TYPE %04X "
,
rh
->
type
);
DEBUGP
(
"SGS_LEFT %u %02X
\n
"
,
rh
->
segments_left
,
rh
->
segments_left
);
DEBUGP
(
"IPv6 RT segsleft %02X "
,
(
segsleft_match
(
rtinfo
->
segsleft
[
0
],
rtinfo
->
segsleft
[
1
],
rh
->
segments_left
,
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_SGS
))));
DEBUGP
(
"type %02X %02X %02X "
,
rtinfo
->
rt_type
,
rh
->
type
,
(
!
(
rtinfo
->
flags
&
IP6T_RT_TYP
)
||
((
rtinfo
->
rt_type
==
rh
->
type
)
^
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_TYP
))));
DEBUGP
(
"len %02X %04X %02X "
,
rtinfo
->
hdrlen
,
hdrlen
,
(
!
(
rtinfo
->
flags
&
IP6T_RT_LEN
)
||
((
rtinfo
->
hdrlen
==
hdrlen
)
^
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_LEN
))));
DEBUGP
(
"res %02X %02X %02X "
,
(
rtinfo
->
flags
&
IP6T_RT_RES
),
((
struct
rt0_hdr
*
)
rh
)
->
reserved
,
!
((
rtinfo
->
flags
&
IP6T_RT_RES
)
&&
(((
struct
rt0_hdr
*
)
rh
)
->
reserved
)));
ret
=
(
rh
!=
NULL
)
&&
(
segsleft_match
(
rtinfo
->
segsleft
[
0
],
rtinfo
->
segsleft
[
1
],
rh
->
segments_left
,
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_SGS
)))
&&
(
!
(
rtinfo
->
flags
&
IP6T_RT_LEN
)
||
((
rtinfo
->
hdrlen
==
hdrlen
)
^
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_LEN
)))
&&
(
!
(
rtinfo
->
flags
&
IP6T_RT_TYP
)
||
((
rtinfo
->
rt_type
==
rh
->
type
)
^
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_TYP
)));
rh
=
skb_header_pointer
(
skb
,
ptr
,
sizeof
(
_route
),
&
_route
);
if
(
rh
==
NULL
)
{
*
hotdrop
=
1
;
return
0
;
}
hdrlen
=
ipv6_optlen
(
rh
);
if
(
skb
->
len
-
ptr
<
hdrlen
)
{
/* Pcket smaller than its length field */
return
0
;
}
DEBUGP
(
"IPv6 RT LEN %u %u "
,
hdrlen
,
rh
->
hdrlen
);
DEBUGP
(
"TYPE %04X "
,
rh
->
type
);
DEBUGP
(
"SGS_LEFT %u %02X
\n
"
,
rh
->
segments_left
,
rh
->
segments_left
);
DEBUGP
(
"IPv6 RT segsleft %02X "
,
(
segsleft_match
(
rtinfo
->
segsleft
[
0
],
rtinfo
->
segsleft
[
1
],
rh
->
segments_left
,
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_SGS
))));
DEBUGP
(
"type %02X %02X %02X "
,
rtinfo
->
rt_type
,
rh
->
type
,
(
!
(
rtinfo
->
flags
&
IP6T_RT_TYP
)
||
((
rtinfo
->
rt_type
==
rh
->
type
)
^
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_TYP
))));
DEBUGP
(
"len %02X %04X %02X "
,
rtinfo
->
hdrlen
,
hdrlen
,
(
!
(
rtinfo
->
flags
&
IP6T_RT_LEN
)
||
((
rtinfo
->
hdrlen
==
hdrlen
)
^
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_LEN
))));
DEBUGP
(
"res %02X %02X %02X "
,
(
rtinfo
->
flags
&
IP6T_RT_RES
),
((
struct
rt0_hdr
*
)
rh
)
->
reserved
,
!
((
rtinfo
->
flags
&
IP6T_RT_RES
)
&&
(((
struct
rt0_hdr
*
)
rh
)
->
reserved
)));
ret
=
(
rh
!=
NULL
)
&&
(
segsleft_match
(
rtinfo
->
segsleft
[
0
],
rtinfo
->
segsleft
[
1
],
rh
->
segments_left
,
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_SGS
)))
&&
(
!
(
rtinfo
->
flags
&
IP6T_RT_LEN
)
||
((
rtinfo
->
hdrlen
==
hdrlen
)
^
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_LEN
)))
&&
(
!
(
rtinfo
->
flags
&
IP6T_RT_TYP
)
||
((
rtinfo
->
rt_type
==
rh
->
type
)
^
!!
(
rtinfo
->
invflags
&
IP6T_RT_INV_TYP
)));
if
(
ret
&&
(
rtinfo
->
flags
&
IP6T_RT_RES
))
{
u_int32_t
*
rp
,
_reserved
;
rp
=
skb_header_pointer
(
skb
,
ptr
+
offsetof
(
struct
rt0_hdr
,
reserved
),
sizeof
(
_reserved
),
&
_reserved
);
ptr
+
offsetof
(
struct
rt0_hdr
,
reserved
),
sizeof
(
_reserved
),
&
_reserved
);
ret
=
(
*
rp
==
0
);
}
DEBUGP
(
"#%d "
,
rtinfo
->
addrnr
);
if
(
!
(
rtinfo
->
flags
&
IP6T_RT_FST
)
)
{
return
ret
;
DEBUGP
(
"#%d "
,
rtinfo
->
addrnr
);
if
(
!
(
rtinfo
->
flags
&
IP6T_RT_FST
))
{
return
ret
;
}
else
if
(
rtinfo
->
flags
&
IP6T_RT_FST_NSTRICT
)
{
DEBUGP
(
"Not strict "
);
if
(
rtinfo
->
addrnr
>
(
unsigned
int
)((
hdrlen
-
8
)
/
16
)
)
{
if
(
rtinfo
->
addrnr
>
(
unsigned
int
)((
hdrlen
-
8
)
/
16
))
{
DEBUGP
(
"There isn't enough space
\n
"
);
return
0
;
}
else
{
unsigned
int
i
=
0
;
DEBUGP
(
"#%d "
,
rtinfo
->
addrnr
);
for
(
temp
=
0
;
temp
<
(
unsigned
int
)((
hdrlen
-
8
)
/
16
);
temp
++
){
DEBUGP
(
"#%d "
,
rtinfo
->
addrnr
);
for
(
temp
=
0
;
temp
<
(
unsigned
int
)((
hdrlen
-
8
)
/
16
);
temp
++
)
{
ap
=
skb_header_pointer
(
skb
,
ptr
+
sizeof
(
struct
rt0_hdr
)
...
...
@@ -141,24 +147,26 @@ match(const struct sk_buff *skb,
BUG_ON
(
ap
==
NULL
);
if
(
ipv6_addr_equal
(
ap
,
&
rtinfo
->
addrs
[
i
]))
{
DEBUGP
(
"i=%d temp=%d;
\n
"
,
i
,
temp
);
DEBUGP
(
"i=%d temp=%d;
\n
"
,
i
,
temp
);
i
++
;
}
if
(
i
==
rtinfo
->
addrnr
)
break
;
if
(
i
==
rtinfo
->
addrnr
)
break
;
}
DEBUGP
(
"i=%d #%d
\n
"
,
i
,
rtinfo
->
addrnr
);
if
(
i
==
rtinfo
->
addrnr
)
return
ret
;
else
return
0
;
else
return
0
;
}
}
else
{
DEBUGP
(
"Strict "
);
if
(
rtinfo
->
addrnr
>
(
unsigned
int
)((
hdrlen
-
8
)
/
16
)
)
{
if
(
rtinfo
->
addrnr
>
(
unsigned
int
)((
hdrlen
-
8
)
/
16
))
{
DEBUGP
(
"There isn't enough space
\n
"
);
return
0
;
}
else
{
DEBUGP
(
"#%d "
,
rtinfo
->
addrnr
);
for
(
temp
=
0
;
temp
<
rtinfo
->
addrnr
;
temp
++
)
{
DEBUGP
(
"#%d "
,
rtinfo
->
addrnr
);
for
(
temp
=
0
;
temp
<
rtinfo
->
addrnr
;
temp
++
)
{
ap
=
skb_header_pointer
(
skb
,
ptr
+
sizeof
(
struct
rt0_hdr
)
...
...
@@ -171,9 +179,11 @@ match(const struct sk_buff *skb,
break
;
}
DEBUGP
(
"temp=%d #%d
\n
"
,
temp
,
rtinfo
->
addrnr
);
if
((
temp
==
rtinfo
->
addrnr
)
&&
(
temp
==
(
unsigned
int
)((
hdrlen
-
8
)
/
16
)))
if
((
temp
==
rtinfo
->
addrnr
)
&&
(
temp
==
(
unsigned
int
)((
hdrlen
-
8
)
/
16
)))
return
ret
;
else
return
0
;
else
return
0
;
}
}
...
...
@@ -183,32 +193,31 @@ match(const struct sk_buff *skb,
/* Called when user tries to insert an entry of this type. */
static
int
checkentry
(
const
char
*
tablename
,
const
void
*
entry
,
void
*
matchinfo
,
unsigned
int
matchinfosize
,
unsigned
int
hook_mask
)
const
void
*
entry
,
void
*
matchinfo
,
unsigned
int
matchinfosize
,
unsigned
int
hook_mask
)
{
const
struct
ip6t_rt
*
rtinfo
=
matchinfo
;
if
(
matchinfosize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_rt
)))
{
DEBUGP
(
"ip6t_rt: matchsize %u != %u
\n
"
,
matchinfosize
,
IP6T_ALIGN
(
sizeof
(
struct
ip6t_rt
)));
return
0
;
}
if
(
rtinfo
->
invflags
&
~
IP6T_RT_INV_MASK
)
{
DEBUGP
(
"ip6t_rt: unknown flags %X
\n
"
,
rtinfo
->
invflags
);
return
0
;
}
if
(
(
rtinfo
->
flags
&
(
IP6T_RT_RES
|
IP6T_RT_FST_MASK
))
&&
(
!
(
rtinfo
->
flags
&
IP6T_RT_TYP
)
||
(
rtinfo
->
rt_type
!=
0
)
||
(
rtinfo
->
invflags
&
IP6T_RT_INV_TYP
))
)
{
DEBUGP
(
"`--rt-type 0' required before `--rt-0-*'"
);
return
0
;
}
return
1
;
const
struct
ip6t_rt
*
rtinfo
=
matchinfo
;
if
(
matchinfosize
!=
IP6T_ALIGN
(
sizeof
(
struct
ip6t_rt
)))
{
DEBUGP
(
"ip6t_rt: matchsize %u != %u
\n
"
,
matchinfosize
,
IP6T_ALIGN
(
sizeof
(
struct
ip6t_rt
)));
return
0
;
}
if
(
rtinfo
->
invflags
&
~
IP6T_RT_INV_MASK
)
{
DEBUGP
(
"ip6t_rt: unknown flags %X
\n
"
,
rtinfo
->
invflags
);
return
0
;
}
if
((
rtinfo
->
flags
&
(
IP6T_RT_RES
|
IP6T_RT_FST_MASK
))
&&
(
!
(
rtinfo
->
flags
&
IP6T_RT_TYP
)
||
(
rtinfo
->
rt_type
!=
0
)
||
(
rtinfo
->
invflags
&
IP6T_RT_INV_TYP
)))
{
DEBUGP
(
"`--rt-type 0' required before `--rt-0-*'"
);
return
0
;
}
return
1
;
}
static
struct
ip6t_match
rt_match
=
{
...
...
@@ -220,12 +229,12 @@ static struct ip6t_match rt_match = {
static
int
__init
init
(
void
)
{
return
ip6t_register_match
(
&
rt_match
);
return
ip6t_register_match
(
&
rt_match
);
}
static
void
__exit
cleanup
(
void
)
{
ip6t_unregister_match
(
&
rt_match
);
ip6t_unregister_match
(
&
rt_match
);
}
module_init
(
init
);
...
...
net/rxrpc/krxtimod.c
View file @
15578eeb
...
...
@@ -81,7 +81,7 @@ static int krxtimod(void *arg)
for
(;;)
{
unsigned
long
jif
;
signed
long
timeout
;
long
timeout
;
/* deal with the server being asked to die */
if
(
krxtimod_die
)
{
...
...
net/rxrpc/proc.c
View file @
15578eeb
...
...
@@ -361,7 +361,7 @@ static void rxrpc_proc_peers_stop(struct seq_file *p, void *v)
static
int
rxrpc_proc_peers_show
(
struct
seq_file
*
m
,
void
*
v
)
{
struct
rxrpc_peer
*
peer
=
list_entry
(
v
,
struct
rxrpc_peer
,
proc_link
);
signed
long
timeout
;
long
timeout
;
/* display header on line 1 */
if
(
v
==
SEQ_START_TOKEN
)
{
...
...
@@ -373,8 +373,8 @@ static int rxrpc_proc_peers_show(struct seq_file *m, void *v)
/* display one peer per line on subsequent lines */
timeout
=
0
;
if
(
!
list_empty
(
&
peer
->
timeout
.
link
))
timeout
=
(
signed
long
)
peer
->
timeout
.
timo_jif
-
(
signed
long
)
jiffies
;
timeout
=
(
long
)
peer
->
timeout
.
timo_jif
-
(
long
)
jiffies
;
seq_printf
(
m
,
"%5hu %08x %5d %5d %8ld %5Zu %7lu
\n
"
,
peer
->
trans
->
port
,
...
...
@@ -468,7 +468,7 @@ static void rxrpc_proc_conns_stop(struct seq_file *p, void *v)
static
int
rxrpc_proc_conns_show
(
struct
seq_file
*
m
,
void
*
v
)
{
struct
rxrpc_connection
*
conn
;
signed
long
timeout
;
long
timeout
;
conn
=
list_entry
(
v
,
struct
rxrpc_connection
,
proc_link
);
...
...
@@ -484,8 +484,8 @@ static int rxrpc_proc_conns_show(struct seq_file *m, void *v)
/* display one conn per line on subsequent lines */
timeout
=
0
;
if
(
!
list_empty
(
&
conn
->
timeout
.
link
))
timeout
=
(
signed
long
)
conn
->
timeout
.
timo_jif
-
(
signed
long
)
jiffies
;
timeout
=
(
long
)
conn
->
timeout
.
timo_jif
-
(
long
)
jiffies
;
seq_printf
(
m
,
"%5hu %08x %5hu %04hx %08x %-3.3s %08x %08x %5Zu %8ld
\n
"
,
...
...
net/sched/sch_prio.c
View file @
15578eeb
...
...
@@ -228,14 +228,13 @@ static int prio_tune(struct Qdisc *sch, struct rtattr *opt)
}
sch_tree_unlock
(
sch
);
for
(
i
=
0
;
i
<=
TC_PRIO_MAX
;
i
++
)
{
int
band
=
q
->
prio2band
[
i
];
if
(
q
->
queues
[
band
]
==
&
noop_qdisc
)
{
for
(
i
=
0
;
i
<
q
->
bands
;
i
++
)
{
if
(
q
->
queues
[
i
]
==
&
noop_qdisc
)
{
struct
Qdisc
*
child
;
child
=
qdisc_create_dflt
(
sch
->
dev
,
&
pfifo_qdisc_ops
);
if
(
child
)
{
sch_tree_lock
(
sch
);
child
=
xchg
(
&
q
->
queues
[
band
],
child
);
child
=
xchg
(
&
q
->
queues
[
i
],
child
);
if
(
child
!=
&
noop_qdisc
)
qdisc_destroy
(
child
);
...
...
net/sched/sch_sfq.c
View file @
15578eeb
...
...
@@ -144,6 +144,8 @@ static unsigned sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb)
if
(
!
(
iph
->
frag_off
&
htons
(
IP_MF
|
IP_OFFSET
))
&&
(
iph
->
protocol
==
IPPROTO_TCP
||
iph
->
protocol
==
IPPROTO_UDP
||
iph
->
protocol
==
IPPROTO_SCTP
||
iph
->
protocol
==
IPPROTO_DCCP
||
iph
->
protocol
==
IPPROTO_ESP
))
h2
^=
*
(((
u32
*
)
iph
)
+
iph
->
ihl
);
break
;
...
...
@@ -155,6 +157,8 @@ static unsigned sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb)
h2
=
iph
->
saddr
.
s6_addr32
[
3
]
^
iph
->
nexthdr
;
if
(
iph
->
nexthdr
==
IPPROTO_TCP
||
iph
->
nexthdr
==
IPPROTO_UDP
||
iph
->
nexthdr
==
IPPROTO_SCTP
||
iph
->
nexthdr
==
IPPROTO_DCCP
||
iph
->
nexthdr
==
IPPROTO_ESP
)
h2
^=
*
(
u32
*
)
&
iph
[
1
];
break
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment