diff -urp iproute2-ss050808/include/linux/tcp_diag.h iproute2-ss050808.dccp/include/linux/tcp_diag.h
--- iproute2-ss050808/include/linux/tcp_diag.h	2005-06-22 15:27:49.000000000 -0300
+++ iproute2-ss050808.dccp/include/linux/tcp_diag.h	2005-08-10 00:53:55.000000000 -0300
@@ -3,6 +3,7 @@
 
 /* Just some random number */
 #define TCPDIAG_GETSOCK 18
+#define DCCPDIAG_GETSOCK 19
 
 /* Socket identity */
 struct tcpdiag_sockid
diff -urp iproute2-ss050808/misc/ss.c iproute2-ss050808.dccp/misc/ss.c
--- iproute2-ss050808/misc/ss.c	2005-07-05 19:11:37.000000000 -0300
+++ iproute2-ss050808.dccp/misc/ss.c	2005-08-10 05:34:59.986628856 -0300
@@ -60,6 +60,7 @@ static const char *dg_proto = NULL;
 enum
 {
 	TCP_DB,
+	DCCP_DB,
 	UDP_DB,
 	RAW_DB,
 	UNIX_DG_DB,
@@ -1445,7 +1446,7 @@ int tcp_show_sock(struct nlmsghdr *nlh, 
 	return 0;
 }
 
-int tcp_show_netlink(struct filter *f, FILE *dump_fp)
+int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype)
 {
 	int fd;
 	struct sockaddr_nl nladdr;
@@ -1467,7 +1468,7 @@ int tcp_show_netlink(struct filter *f, F
 	nladdr.nl_family = AF_NETLINK;
 
 	req.nlh.nlmsg_len = sizeof(req);
-	req.nlh.nlmsg_type = TCPDIAG_GETSOCK;
+	req.nlh.nlmsg_type = socktype;
 	req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
 	req.nlh.nlmsg_pid = 0;
 	req.nlh.nlmsg_seq = 123456;
@@ -1635,7 +1636,7 @@ int tcp_show_netlink_file(struct filter 
 	}
 }
 
-int tcp_show(struct filter *f)
+int tcp_show(struct filter *f, int socktype)
 {
 	int fd = -1;
 	char *buf = NULL;
@@ -1647,7 +1648,7 @@ int tcp_show(struct filter *f)
 		return tcp_show_netlink_file(f);
 
 	if (!getenv("PROC_NET_TCP") && !getenv("PROC_ROOT")
-	    && tcp_show_netlink(f, NULL) == 0)
+	    && tcp_show_netlink(f, NULL, socktype) == 0)
 		return 0;
 
 	/* Sigh... We have to parse /proc/net/tcp... */
@@ -2389,6 +2390,7 @@ static void usage(void)
 "   -0, --packet	display PACKET sockets\n"
 "   -t, --tcp		display only TCP sockets\n"
 "   -u, --udp		display only UDP sockets\n"
+"   -d, --dccp		display only DCCP sockets\n"
 "   -w, --raw		display only RAW sockets\n"
 "   -x, --unix		display only Unix domain sockets\n"
 "   -f, --family=FAMILY display sockets of type FAMILY\n"
@@ -2438,6 +2440,7 @@ static const struct option long_opts[] =
 	{ "memory", 0, 0, 'm' },
 	{ "info", 0, 0, 'i' },
 	{ "processes", 0, 0, 'p' },
+	{ "dccp", 0, 0, 'd' },
 	{ "tcp", 0, 0, 't' },
 	{ "udp", 0, 0, 'u' },
 	{ "raw", 0, 0, 'w' },
@@ -2472,7 +2475,7 @@ int main(int argc, char *argv[])
 
 	current_filter.states = default_filter.states;
 
-	while ((ch = getopt_long(argc, argv, "haletuwxnro460spf:miA:D:F:vV",
+	while ((ch = getopt_long(argc, argv, "dhaletuwxnro460spf:miA:D:F:vV",
 				 long_opts, NULL)) != EOF) {
 		switch(ch) {
 		case 'n':
@@ -2497,6 +2500,10 @@ int main(int argc, char *argv[])
 		case 'p':
 			show_users++;
 			break;
+		case 'd':
+			current_filter.dbs |= (1<<DCCP_DB);
+			do_default = 0;
+			break;
 		case 't':
 			current_filter.dbs |= (1<<TCP_DB);
 			do_default = 0;
@@ -2561,9 +2568,11 @@ int main(int argc, char *argv[])
 				if (strcmp(p, "all") == 0) {
 					current_filter.dbs = ALL_DB;
 				} else if (strcmp(p, "inet") == 0) {
-					current_filter.dbs |= (1<<TCP_DB)|(1<<UDP_DB)|(1<<RAW_DB);
+					current_filter.dbs |= (1<<TCP_DB)|(1<<DCCP_DB)|(1<<UDP_DB)|(1<<RAW_DB);
 				} else if (strcmp(p, "udp") == 0) {
 					current_filter.dbs |= (1<<UDP_DB);
+				} else if (strcmp(p, "dccp") == 0) {
+					current_filter.dbs |= (1<<DCCP_DB);
 				} else if (strcmp(p, "tcp") == 0) {
 					current_filter.dbs |= (1<<TCP_DB);
 				} else if (strcmp(p, "raw") == 0) {
@@ -2686,7 +2695,7 @@ int main(int argc, char *argv[])
 	}
 
 	if (resolve_services && resolve_hosts &&
-	    (current_filter.dbs&(UNIX_DBM|(1<<TCP_DB)|(1<<UDP_DB))))
+	    (current_filter.dbs&(UNIX_DBM|(1<<TCP_DB)|(1<<UDP_DB)|(1<<DCCP_DB))))
 		init_service_resolver();
 
 	/* Now parse filter... */
@@ -2735,7 +2744,7 @@ int main(int argc, char *argv[])
 				exit(-1);
 			}
 		}
-		tcp_show_netlink(&current_filter, dump_fp);
+		tcp_show_netlink(&current_filter, dump_fp, TCPDIAG_GETSOCK);
 		fflush(dump_fp);
 		exit(0);
 	}
@@ -2804,6 +2813,8 @@ int main(int argc, char *argv[])
 	if (current_filter.dbs & (1<<UDP_DB))
 		udp_show(&current_filter);
 	if (current_filter.dbs & (1<<TCP_DB))
-		tcp_show(&current_filter);
+		tcp_show(&current_filter, TCPDIAG_GETSOCK);
+	if (current_filter.dbs & (1<<DCCP_DB))
+		tcp_show(&current_filter, DCCPDIAG_GETSOCK);
 	return 0;
 }
