Skip to content

Commit

Permalink
[IPV6]: make extended headers to return an error at initialization
Browse files Browse the repository at this point in the history
This patch factorize the code for the differents init functions for rthdr,
nodata, destopt in a single function exthdrs_init.
This function returns an error so the af_inet6 module can check correctly
the initialization.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Daniel Lezcano authored and David S. Miller committed Jan 28, 2008
1 parent 0a3e78a commit 248b238
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 31 deletions.
5 changes: 2 additions & 3 deletions include/net/transp_v6.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@ extern struct proto tcpv6_prot;
struct flowi;

/* extention headers */
extern void ipv6_rthdr_init(void);
extern int ipv6_exthdrs_init(void);
extern void ipv6_exthdrs_exit(void);
extern void ipv6_frag_init(void);
extern void ipv6_nodata_init(void);
extern void ipv6_destopt_init(void);

/* transport protocols */
extern void rawv6_init(void);
Expand Down
10 changes: 7 additions & 3 deletions net/ipv6/af_inet6.c
Original file line number Diff line number Diff line change
Expand Up @@ -859,10 +859,11 @@ static int __init inet6_init(void)
goto addrconf_fail;

/* Init v6 extension headers. */
ipv6_rthdr_init();
err = ipv6_exthdrs_init();
if (err)
goto ipv6_exthdrs_fail;

ipv6_frag_init();
ipv6_nodata_init();
ipv6_destopt_init();

/* Init v6 transport protocols. */
udpv6_init();
Expand All @@ -874,6 +875,8 @@ static int __init inet6_init(void)
out:
return err;

ipv6_exthdrs_fail:
addrconf_cleanup();
addrconf_fail:
ip6_flowlabel_cleanup();
ip6_flowlabel_fail:
Expand Down Expand Up @@ -932,6 +935,7 @@ static void __exit inet6_exit(void)
/* Cleanup code parts. */
ipv6_packet_cleanup();

ipv6_exthdrs_exit();
addrconf_cleanup();
ip6_flowlabel_cleanup();
ip6_route_cleanup();
Expand Down
64 changes: 39 additions & 25 deletions net/ipv6/exthdrs.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,28 +308,6 @@ static int ipv6_destopt_rcv(struct sk_buff *skb)
return -1;
}

static struct inet6_protocol destopt_protocol = {
.handler = ipv6_destopt_rcv,
.flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR,
};

void __init ipv6_destopt_init(void)
{
if (inet6_add_protocol(&destopt_protocol, IPPROTO_DSTOPTS) < 0)
printk(KERN_ERR "ipv6_destopt_init: Could not register protocol\n");
}

static struct inet6_protocol nodata_protocol = {
.handler = dst_discard,
.flags = INET6_PROTO_NOPOLICY,
};

void __init ipv6_nodata_init(void)
{
if (inet6_add_protocol(&nodata_protocol, IPPROTO_NONE) < 0)
printk(KERN_ERR "ipv6_nodata_init: Could not register protocol\n");
}

/********************************
Routing header.
********************************/
Expand Down Expand Up @@ -527,12 +505,48 @@ static struct inet6_protocol rthdr_protocol = {
.flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR,
};

void __init ipv6_rthdr_init(void)
static struct inet6_protocol destopt_protocol = {
.handler = ipv6_destopt_rcv,
.flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR,
};

static struct inet6_protocol nodata_protocol = {
.handler = dst_discard,
.flags = INET6_PROTO_NOPOLICY,
};

int __init ipv6_exthdrs_init(void)
{
if (inet6_add_protocol(&rthdr_protocol, IPPROTO_ROUTING) < 0)
printk(KERN_ERR "ipv6_rthdr_init: Could not register protocol\n");
int ret;

ret = inet6_add_protocol(&rthdr_protocol, IPPROTO_ROUTING);
if (ret)
goto out;

ret = inet6_add_protocol(&destopt_protocol, IPPROTO_DSTOPTS);
if (ret)
goto out_rthdr;

ret = inet6_add_protocol(&nodata_protocol, IPPROTO_NONE);
if (ret)
goto out_destopt;

out:
return ret;
out_rthdr:
inet6_del_protocol(&rthdr_protocol, IPPROTO_ROUTING);
out_destopt:
inet6_del_protocol(&destopt_protocol, IPPROTO_DSTOPTS);
goto out;
};

void ipv6_exthdrs_exit(void)
{
inet6_del_protocol(&nodata_protocol, IPPROTO_NONE);
inet6_del_protocol(&destopt_protocol, IPPROTO_DSTOPTS);
inet6_del_protocol(&rthdr_protocol, IPPROTO_ROUTING);
}

/**********************************
Hop-by-hop options.
**********************************/
Expand Down

0 comments on commit 248b238

Please sign in to comment.