Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
aa447acb
Commit
aa447acb
authored
Jun 02, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Automatic merge of
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
parents
31760463
5ba0eac6
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
42 additions
and
283 deletions
+42
-283
drivers/atm/Makefile
drivers/atm/Makefile
+2
-1
drivers/atm/fore200e.c
drivers/atm/fore200e.c
+2
-4
drivers/atm/he.c
drivers/atm/he.c
+2
-4
drivers/atm/nicstar.c
drivers/atm/nicstar.c
+10
-10
drivers/atm/zatm.c
drivers/atm/zatm.c
+4
-7
drivers/net/shaper.c
drivers/net/shaper.c
+19
-67
include/linux/if_shaper.h
include/linux/if_shaper.h
+1
-2
include/linux/netdevice.h
include/linux/netdevice.h
+1
-1
net/ipv4/ipvs/Makefile
net/ipv4/ipvs/Makefile
+1
-1
net/ipv4/ipvs/ip_vs_proto.c
net/ipv4/ipvs/ip_vs_proto.c
+0
-3
net/ipv4/ipvs/ip_vs_proto_icmp.c
net/ipv4/ipvs/ip_vs_proto_icmp.c
+0
-182
net/ipv6/ipv6_syms.c
net/ipv6/ipv6_syms.c
+0
-1
No files found.
drivers/atm/Makefile
View file @
aa447acb
...
...
@@ -39,7 +39,8 @@ ifeq ($(CONFIG_ATM_FORE200E_PCA),y)
fore_200e-objs
+=
fore200e_pca_fw.o
# guess the target endianess to choose the right PCA-200E firmware image
ifeq
($(CONFIG_ATM_FORE200E_PCA_DEFAULT_FW),y)
CONFIG_ATM_FORE200E_PCA_FW
=
$(
shell
if
test
-n
"
`
$(CC)
-E
-dM
$(src)
/../../include/asm/byteorder.h |
grep
' __LITTLE_ENDIAN '
`
"
;
then
echo
$(obj)
/pca200e.bin
;
else
echo
$(obj)
/pca200e_ecd.bin2
;
fi
)
byteorder.h
:=
include
$(
if
$(
patsubst
$(srctree)
,,
$(objtree)
)
,2
)
/asm/byteorder.h
CONFIG_ATM_FORE200E_PCA_FW
:=
$(obj)
/pca200e
$(
if
$(
shell
$(CC)
-E
-dM
$(byteorder.h)
|
grep
' __LITTLE_ENDIAN '
)
,.bin,_ecd.bin2
)
endif
endif
...
...
drivers/atm/fore200e.c
View file @
aa447acb
...
...
@@ -383,8 +383,7 @@ fore200e_shutdown(struct fore200e* fore200e)
switch
(
fore200e
->
state
)
{
case
FORE200E_STATE_COMPLETE
:
if
(
fore200e
->
stats
)
kfree
(
fore200e
->
stats
);
kfree
(
fore200e
->
stats
);
case
FORE200E_STATE_IRQ
:
free_irq
(
fore200e
->
irq
,
fore200e
->
atm_dev
);
...
...
@@ -963,8 +962,7 @@ fore200e_tx_irq(struct fore200e* fore200e)
entry
,
txq
->
tail
,
entry
->
vc_map
,
entry
->
skb
);
/* free copy of misaligned data */
if
(
entry
->
data
)
kfree
(
entry
->
data
);
kfree
(
entry
->
data
);
/* remove DMA mapping */
fore200e
->
bus
->
dma_unmap
(
fore200e
,
entry
->
tpd
->
tsd
[
0
].
buffer
,
entry
->
tpd
->
tsd
[
0
].
length
,
...
...
drivers/atm/he.c
View file @
aa447acb
...
...
@@ -412,8 +412,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
init_one_failure:
if
(
atm_dev
)
atm_dev_deregister
(
atm_dev
);
if
(
he_dev
)
kfree
(
he_dev
);
kfree
(
he_dev
);
pci_disable_device
(
pci_dev
);
return
err
;
}
...
...
@@ -2534,8 +2533,7 @@ he_open(struct atm_vcc *vcc)
open_failed:
if
(
err
)
{
if
(
he_vcc
)
kfree
(
he_vcc
);
kfree
(
he_vcc
);
clear_bit
(
ATM_VF_ADDR
,
&
vcc
->
flags
);
}
else
...
...
drivers/atm/nicstar.c
View file @
aa447acb
...
...
@@ -676,10 +676,10 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
PRINTK
(
"nicstar%d: RSQ base at 0x%x.
\n
"
,
i
,
(
u32
)
card
->
rsq
.
base
);
/* Initialize SCQ0, the only VBR SCQ used */
card
->
scq1
=
(
scq_info
*
)
NULL
;
card
->
scq2
=
(
scq_info
*
)
NULL
;
card
->
scq1
=
NULL
;
card
->
scq2
=
NULL
;
card
->
scq0
=
get_scq
(
VBR_SCQSIZE
,
NS_VRSCD0
);
if
(
card
->
scq0
==
(
scq_info
*
)
NULL
)
if
(
card
->
scq0
==
NULL
)
{
printk
(
"nicstar%d: can't get SCQ0.
\n
"
,
i
);
error
=
12
;
...
...
@@ -993,24 +993,24 @@ static scq_info *get_scq(int size, u32 scd)
int
i
;
if
(
size
!=
VBR_SCQSIZE
&&
size
!=
CBR_SCQSIZE
)
return
(
scq_info
*
)
NULL
;
return
NULL
;
scq
=
(
scq_info
*
)
kmalloc
(
sizeof
(
scq_info
),
GFP_KERNEL
);
if
(
scq
==
(
scq_info
*
)
NULL
)
return
(
scq_info
*
)
NULL
;
if
(
scq
==
NULL
)
return
NULL
;
scq
->
org
=
kmalloc
(
2
*
size
,
GFP_KERNEL
);
if
(
scq
->
org
==
NULL
)
{
kfree
(
scq
);
return
(
scq_info
*
)
NULL
;
return
NULL
;
}
scq
->
skb
=
(
struct
sk_buff
**
)
kmalloc
(
sizeof
(
struct
sk_buff
*
)
*
(
size
/
NS_SCQE_SIZE
),
GFP_KERNEL
);
if
(
scq
->
skb
==
(
struct
sk_buff
**
)
NULL
)
if
(
scq
->
skb
==
NULL
)
{
kfree
(
scq
->
org
);
kfree
(
scq
);
return
(
scq_info
*
)
NULL
;
return
NULL
;
}
scq
->
num_entries
=
size
/
NS_SCQE_SIZE
;
scq
->
base
=
(
ns_scqe
*
)
ALIGN_ADDRESS
(
scq
->
org
,
size
);
...
...
@@ -1498,7 +1498,7 @@ static int ns_open(struct atm_vcc *vcc)
vc
->
cbr_scd
=
NS_FRSCD
+
frscdi
*
NS_FRSCD_SIZE
;
scq
=
get_scq
(
CBR_SCQSIZE
,
vc
->
cbr_scd
);
if
(
scq
==
(
scq_info
*
)
NULL
)
if
(
scq
==
NULL
)
{
PRINTK
(
"nicstar%d: can't get fixed rate SCQ.
\n
"
,
card
->
index
);
card
->
scd2vc
[
frscdi
]
=
NULL
;
...
...
drivers/atm/zatm.c
View file @
aa447acb
...
...
@@ -902,7 +902,7 @@ static void close_tx(struct atm_vcc *vcc)
zatm_dev
->
tx_bw
+=
vcc
->
qos
.
txtp
.
min_pcr
;
dealloc_shaper
(
vcc
->
dev
,
zatm_vcc
->
shaper
);
}
if
(
zatm_vcc
->
ring
)
kfree
(
zatm_vcc
->
ring
);
kfree
(
zatm_vcc
->
ring
);
}
...
...
@@ -1339,12 +1339,9 @@ static int __init zatm_start(struct atm_dev *dev)
return
0
;
out:
for
(
i
=
0
;
i
<
NR_MBX
;
i
++
)
if
(
zatm_dev
->
mbx_start
[
i
]
!=
0
)
kfree
((
void
*
)
zatm_dev
->
mbx_start
[
i
]);
if
(
zatm_dev
->
rx_map
!=
NULL
)
kfree
(
zatm_dev
->
rx_map
);
if
(
zatm_dev
->
tx_map
!=
NULL
)
kfree
(
zatm_dev
->
tx_map
);
kfree
(
zatm_dev
->
mbx_start
[
i
]);
kfree
(
zatm_dev
->
rx_map
);
kfree
(
zatm_dev
->
tx_map
);
free_irq
(
zatm_dev
->
irq
,
dev
);
return
error
;
}
...
...
drivers/net/shaper.c
View file @
aa447acb
...
...
@@ -100,35 +100,8 @@ static int sh_debug; /* Debug flag */
#define SHAPER_BANNER "CymruNet Traffic Shaper BETA 0.04 for Linux 2.1\n"
/*
* Locking
*/
static
int
shaper_lock
(
struct
shaper
*
sh
)
{
/*
* Lock in an interrupt must fail
*/
while
(
test_and_set_bit
(
0
,
&
sh
->
locked
))
{
if
(
!
in_interrupt
())
sleep_on
(
&
sh
->
wait_queue
);
else
return
0
;
}
return
1
;
}
static
void
shaper_kick
(
struct
shaper
*
sh
);
static
void
shaper_unlock
(
struct
shaper
*
sh
)
{
clear_bit
(
0
,
&
sh
->
locked
);
wake_up
(
&
sh
->
wait_queue
);
shaper_kick
(
sh
);
}
/*
* Compute clocks on a buffer
*/
...
...
@@ -157,17 +130,15 @@ static void shaper_setspeed(struct shaper *shaper, int bitspersec)
* Throw a frame at a shaper.
*/
static
int
shaper_qframe
(
struct
shaper
*
shaper
,
struct
sk_buff
*
skb
)
static
int
shaper_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
struct
shaper
*
shaper
=
dev
->
priv
;
struct
sk_buff
*
ptr
;
/*
* Get ready to work on this shaper. Lock may fail if its
* an interrupt and locked.
*/
if
(
!
shaper_lock
(
shaper
))
return
-
1
;
if
(
down_trylock
(
&
shaper
->
sem
))
return
-
1
;
ptr
=
shaper
->
sendq
.
prev
;
/*
...
...
@@ -260,7 +231,8 @@ static int shaper_qframe(struct shaper *shaper, struct sk_buff *skb)
dev_kfree_skb
(
ptr
);
shaper
->
stats
.
collisions
++
;
}
shaper_unlock
(
shaper
);
shaper_kick
(
shaper
);
up
(
&
shaper
->
sem
);
return
0
;
}
...
...
@@ -297,8 +269,13 @@ static void shaper_queue_xmit(struct shaper *shaper, struct sk_buff *skb)
static
void
shaper_timer
(
unsigned
long
data
)
{
struct
shaper
*
sh
=
(
struct
shaper
*
)
data
;
shaper_kick
(
sh
);
struct
shaper
*
shaper
=
(
struct
shaper
*
)
data
;
if
(
!
down_trylock
(
&
shaper
->
sem
))
{
shaper_kick
(
shaper
);
up
(
&
shaper
->
sem
);
}
else
mod_timer
(
&
shaper
->
timer
,
jiffies
);
}
/*
...
...
@@ -310,19 +287,6 @@ static void shaper_kick(struct shaper *shaper)
{
struct
sk_buff
*
skb
;
/*
* Shaper unlock will kick
*/
if
(
test_and_set_bit
(
0
,
&
shaper
->
locked
))
{
if
(
sh_debug
)
printk
(
"Shaper locked.
\n
"
);
mod_timer
(
&
shaper
->
timer
,
jiffies
);
return
;
}
/*
* Walk the list (may be empty)
*/
...
...
@@ -364,8 +328,6 @@ static void shaper_kick(struct shaper *shaper)
if
(
skb
!=
NULL
)
mod_timer
(
&
shaper
->
timer
,
SHAPERCB
(
skb
)
->
shapeclock
);
clear_bit
(
0
,
&
shaper
->
locked
);
}
...
...
@@ -376,14 +338,12 @@ static void shaper_kick(struct shaper *shaper)
static
void
shaper_flush
(
struct
shaper
*
shaper
)
{
struct
sk_buff
*
skb
;
if
(
!
shaper_lock
(
shaper
))
{
printk
(
KERN_ERR
"shaper: shaper_flush() called by an irq!
\n
"
);
return
;
}
down
(
&
shaper
->
sem
);
while
((
skb
=
skb_dequeue
(
&
shaper
->
sendq
))
!=
NULL
)
dev_kfree_skb
(
skb
);
shaper_unlock
(
shaper
);
shaper_kick
(
shaper
);
up
(
&
shaper
->
sem
);
}
/*
...
...
@@ -426,13 +386,6 @@ static int shaper_close(struct net_device *dev)
* ARP and other resolutions and not before.
*/
static
int
shaper_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
struct
shaper
*
sh
=
dev
->
priv
;
return
shaper_qframe
(
sh
,
skb
);
}
static
struct
net_device_stats
*
shaper_get_stats
(
struct
net_device
*
dev
)
{
struct
shaper
*
sh
=
dev
->
priv
;
...
...
@@ -623,7 +576,6 @@ static void shaper_init_priv(struct net_device *dev)
init_timer
(
&
sh
->
timer
);
sh
->
timer
.
function
=
shaper_timer
;
sh
->
timer
.
data
=
(
unsigned
long
)
sh
;
init_waitqueue_head
(
&
sh
->
wait_queue
);
}
/*
...
...
include/linux/if_shaper.h
View file @
aa447acb
...
...
@@ -23,7 +23,7 @@ struct shaper
__u32
shapeclock
;
unsigned
long
recovery
;
/* Time we can next clock a packet out on
an empty queue */
unsigned
long
locked
;
struct
semaphore
sem
;
struct
net_device_stats
stats
;
struct
net_device
*
dev
;
int
(
*
hard_start_xmit
)
(
struct
sk_buff
*
skb
,
...
...
@@ -38,7 +38,6 @@ struct shaper
int
(
*
hard_header_cache
)(
struct
neighbour
*
neigh
,
struct
hh_cache
*
hh
);
void
(
*
header_cache_update
)(
struct
hh_cache
*
hh
,
struct
net_device
*
dev
,
unsigned
char
*
haddr
);
struct
net_device_stats
*
(
*
get_stats
)(
struct
net_device
*
dev
);
wait_queue_head_t
wait_queue
;
struct
timer_list
timer
;
};
...
...
include/linux/netdevice.h
View file @
aa447acb
...
...
@@ -204,7 +204,7 @@ struct hh_cache
/* cached hardware header; allow for machine alignment needs. */
#define HH_DATA_MOD 16
#define HH_DATA_OFF(__len) \
(HH_DATA_MOD - ((
__len) & (HH_DATA_MOD - 1)
))
(HH_DATA_MOD - ((
(__len - 1) & (HH_DATA_MOD - 1)) + 1
))
#define HH_DATA_ALIGN(__len) \
(((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))
unsigned
long
hh_data
[
HH_DATA_ALIGN
(
LL_MAX_HEADER
)
/
sizeof
(
long
)];
...
...
net/ipv4/ipvs/Makefile
View file @
aa447acb
...
...
@@ -11,7 +11,7 @@ ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_AH) += ip_vs_proto_ah.o
ip_vs-objs
:=
ip_vs_conn.o ip_vs_core.o ip_vs_ctl.o ip_vs_sched.o
\
ip_vs_xmit.o ip_vs_app.o ip_vs_sync.o
\
ip_vs_est.o ip_vs_proto.o
ip_vs_proto_icmp.o
\
ip_vs_est.o ip_vs_proto.o
\
$
(
ip_vs_proto-objs-y
)
...
...
net/ipv4/ipvs/ip_vs_proto.c
View file @
aa447acb
...
...
@@ -216,9 +216,6 @@ int ip_vs_protocol_init(void)
#ifdef CONFIG_IP_VS_PROTO_UDP
REGISTER_PROTOCOL
(
&
ip_vs_protocol_udp
);
#endif
#ifdef CONFIG_IP_VS_PROTO_ICMP
REGISTER_PROTOCOL
(
&
ip_vs_protocol_icmp
);
#endif
#ifdef CONFIG_IP_VS_PROTO_AH
REGISTER_PROTOCOL
(
&
ip_vs_protocol_ah
);
#endif
...
...
net/ipv4/ipvs/ip_vs_proto_icmp.c
deleted
100644 → 0
View file @
31760463
/*
* ip_vs_proto_icmp.c: ICMP load balancing support for IP Virtual Server
*
* Authors: Julian Anastasov <ja@ssi.bg>, March 2002
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation;
*
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/icmp.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <net/ip_vs.h>
static
int
icmp_timeouts
[
1
]
=
{
1
*
60
*
HZ
};
static
char
*
icmp_state_name_table
[
1
]
=
{
"ICMP"
};
static
struct
ip_vs_conn
*
icmp_conn_in_get
(
const
struct
sk_buff
*
skb
,
struct
ip_vs_protocol
*
pp
,
const
struct
iphdr
*
iph
,
unsigned
int
proto_off
,
int
inverse
)
{
#if 0
struct ip_vs_conn *cp;
if (likely(!inverse)) {
cp = ip_vs_conn_in_get(iph->protocol,
iph->saddr, 0,
iph->daddr, 0);
} else {
cp = ip_vs_conn_in_get(iph->protocol,
iph->daddr, 0,
iph->saddr, 0);
}
return cp;
#else
return
NULL
;
#endif
}
static
struct
ip_vs_conn
*
icmp_conn_out_get
(
const
struct
sk_buff
*
skb
,
struct
ip_vs_protocol
*
pp
,
const
struct
iphdr
*
iph
,
unsigned
int
proto_off
,
int
inverse
)
{
#if 0
struct ip_vs_conn *cp;
if (likely(!inverse)) {
cp = ip_vs_conn_out_get(iph->protocol,
iph->saddr, 0,
iph->daddr, 0);
} else {
cp = ip_vs_conn_out_get(IPPROTO_UDP,
iph->daddr, 0,
iph->saddr, 0);
}
return cp;
#else
return
NULL
;
#endif
}
static
int
icmp_conn_schedule
(
struct
sk_buff
*
skb
,
struct
ip_vs_protocol
*
pp
,
int
*
verdict
,
struct
ip_vs_conn
**
cpp
)
{
*
verdict
=
NF_ACCEPT
;
return
0
;
}
static
int
icmp_csum_check
(
struct
sk_buff
*
skb
,
struct
ip_vs_protocol
*
pp
)
{
if
(
!
(
skb
->
nh
.
iph
->
frag_off
&
__constant_htons
(
IP_OFFSET
)))
{
if
(
skb
->
ip_summed
!=
CHECKSUM_UNNECESSARY
)
{
if
(
ip_vs_checksum_complete
(
skb
,
skb
->
nh
.
iph
->
ihl
*
4
))
{
IP_VS_DBG_RL_PKT
(
0
,
pp
,
skb
,
0
,
"Failed checksum for"
);
return
0
;
}
}
}
return
1
;
}
static
void
icmp_debug_packet
(
struct
ip_vs_protocol
*
pp
,
const
struct
sk_buff
*
skb
,
int
offset
,
const
char
*
msg
)
{
char
buf
[
256
];
struct
iphdr
_iph
,
*
ih
;
ih
=
skb_header_pointer
(
skb
,
offset
,
sizeof
(
_iph
),
&
_iph
);
if
(
ih
==
NULL
)
sprintf
(
buf
,
"%s TRUNCATED"
,
pp
->
name
);
else
if
(
ih
->
frag_off
&
__constant_htons
(
IP_OFFSET
))
sprintf
(
buf
,
"%s %u.%u.%u.%u->%u.%u.%u.%u frag"
,
pp
->
name
,
NIPQUAD
(
ih
->
saddr
),
NIPQUAD
(
ih
->
daddr
));
else
{
struct
icmphdr
_icmph
,
*
ic
;
ic
=
skb_header_pointer
(
skb
,
offset
+
ih
->
ihl
*
4
,
sizeof
(
_icmph
),
&
_icmph
);
if
(
ic
==
NULL
)
sprintf
(
buf
,
"%s TRUNCATED to %u bytes
\n
"
,
pp
->
name
,
skb
->
len
-
offset
);
else
sprintf
(
buf
,
"%s %u.%u.%u.%u->%u.%u.%u.%u T:%d C:%d"
,
pp
->
name
,
NIPQUAD
(
ih
->
saddr
),
NIPQUAD
(
ih
->
daddr
),
ic
->
type
,
ic
->
code
);
}
printk
(
KERN_DEBUG
"IPVS: %s: %s
\n
"
,
msg
,
buf
);
}
static
int
icmp_state_transition
(
struct
ip_vs_conn
*
cp
,
int
direction
,
const
struct
sk_buff
*
skb
,
struct
ip_vs_protocol
*
pp
)
{
cp
->
timeout
=
pp
->
timeout_table
[
IP_VS_ICMP_S_NORMAL
];
return
1
;
}
static
int
icmp_set_state_timeout
(
struct
ip_vs_protocol
*
pp
,
char
*
sname
,
int
to
)
{
int
num
;
char
**
names
;
num
=
IP_VS_ICMP_S_LAST
;
names
=
icmp_state_name_table
;
return
ip_vs_set_state_timeout
(
pp
->
timeout_table
,
num
,
names
,
sname
,
to
);
}
static
void
icmp_init
(
struct
ip_vs_protocol
*
pp
)
{
pp
->
timeout_table
=
icmp_timeouts
;
}
static
void
icmp_exit
(
struct
ip_vs_protocol
*
pp
)
{
}
struct
ip_vs_protocol
ip_vs_protocol_icmp
=
{
.
name
=
"ICMP"
,
.
protocol
=
IPPROTO_ICMP
,
.
dont_defrag
=
0
,
.
init
=
icmp_init
,
.
exit
=
icmp_exit
,
.
conn_schedule
=
icmp_conn_schedule
,
.
conn_in_get
=
icmp_conn_in_get
,
.
conn_out_get
=
icmp_conn_out_get
,
.
snat_handler
=
NULL
,
.
dnat_handler
=
NULL
,
.
csum_check
=
icmp_csum_check
,
.
state_transition
=
icmp_state_transition
,
.
register_app
=
NULL
,
.
unregister_app
=
NULL
,
.
app_conn_bind
=
NULL
,
.
debug_packet
=
icmp_debug_packet
,
.
timeout_change
=
NULL
,
.
set_state_timeout
=
icmp_set_state_timeout
,
};
net/ipv6/ipv6_syms.c
View file @
aa447acb
...
...
@@ -37,5 +37,4 @@ EXPORT_SYMBOL(in6_dev_finish_destroy);
EXPORT_SYMBOL
(
xfrm6_rcv
);
#endif
EXPORT_SYMBOL
(
rt6_lookup
);
EXPORT_SYMBOL
(
fl6_sock_lookup
);
EXPORT_SYMBOL
(
ipv6_push_nfrag_opts
);
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