connect problem for sctp socket (ipv6 socket) - Runtime fail Invalid Arguments

Hi,
I was porting ipv4 application to ipv6; i was done with TCP transports. Now i am facing problem with SCTp transport at runtime.
To test SCTP transport I am using following server and client socket programs. Server program runs fine, but client program fails giving Invalid Arguments for bind() (FYI: if i give loopback address ::1 client connect to server and exchange message with server, but if i give ipv6 address like ./ipv6client fe80::21d:9ff:fe17:5d0e client programs comes out with Invalid Arguments problem).
What might be the problem with this SCTP transport. Same Programs if i use with TCP transport works fine. Am i missing any setsocketoptions.
Server Program:
#include <stdio.h>
#include <errno.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/sctp.h>

void panic(char* msg, ...)
{ va_list ap;
va_start(ap, msg);
vprintf(msg, ap);
va_end(ap);
abort();
}
int main(int count, char strings[])
{ int sd, portnum;
struct sockaddr_in6 addr;
if ( count == 2 )
portnum = atoi(strings[1]);
else
portnum = 9999;
bzero(&addr, sizeof(addr));
if ( (sd = socket(AF_INET6, SOCK_STREAM, IPPROTO_SCTP)) < 0 )
panic("socket");
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(portnum);
if ( inet_pton(AF_INET6, "0::0", &addr.sin6_addr) == 0 )
panic("inet_pton");
struct linger linger;
/
Set linger on, to 0 time */
linger.l_onoff = 1;
linger.l_linger = 0;
setsockopt(sd, SOL_SOCKET, SO_LINGER,
(char )&linger, sizeof(struct linger));
int dummy = 1;
/
Set reuseaddr socket option /
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
(void )&dummy, sizeof(int));
if ( bind(sd, (struct sockaddr
)&addr, sizeof(addr)) != 0 )
panic("bind6");
if ( listen(sd, 15) != 0 )
panic("listen6");
while (1)
{ int sent, size=sizeof(addr);
int client;
char line[100];
client = accept(sd, (struct sockaddr
)&addr, &size);
fprintf(stderr, "Connected: %s port=%d\n",
inet_ntop(AF_INET6, &addr.sin6_addr, line, sizeof(line)),
addr.sin6_port);
do
{
sent = send(client, line, recv(client, line, sizeof(line), 0), 0);
fprintf(stderr, "server=%s", line);
}
while ( sent > 0 && strcmp(line, "bye\n") != 0 );
close(client);
}
}

Client Program:
#include <stdio.h>
#include <errno.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <stdarg.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/sctp.h>
#include <sys/uio.h>
void panic(char* msg, ...)
{ va_list ap;
va_start(ap, msg);
vprintf(msg, ap);
va_end(ap);
abort();
}
int main(int count, char strings[])
{ int sd, portnum, ret, sz;
struct sockaddr_in6 addr;
char line[100];
struct in6_addr ipv6_local;
sctp_assoc_t id;
struct sctp_initmsg init;
if ( count == 3 )
portnum = atoi(strings[2]);
else
portnum = 9999;
bzero(&addr, sizeof(addr));
if ( (sd = socket(PF_INET6, SOCK_STREAM, IPPROTO_SCTP)) < 0 )
panic("socket");
addr.sin6_family = AF_INET6;
addr.sin6_port = (int)htons(portnum);
if ( inet_pton(AF_INET6, strings[1], &addr.sin6_addr) == 0 )
panic("inet_aton");
setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0\0", 5);
if (connect(sd, (struct sockaddr
)&addr, sizeof(addr)) != 0)
{
perror("?\n");
panic("connect6");
}
do
{
fgets(line, sizeof(line), stdin);
send(sd, line, strlen(line)+1, 0);
recv(sd, line, sizeof(line), 0);
printf("client=%s", line);
}
while ( strcmp(line, "bye\n") != 0 );
close(sd);
}