1235 if (protocol != IPPROTO_UDP && protocol != IPPROTO_TCP) {
1236 printk(KERN_WARNING "svc: only UDP and TCP "
1237 "sockets supported\n");
1238 return ERR_PTR(-EINVAL);
1239 }
1240 type = (protocol == IPPROTO_UDP)? SOCK_DGRAM : SOCK_STREAM;
1241
1242 error = sock_create_kern(sin->sa_family, type, protocol, &sock);
1243 if (error < 0)
1244 return ERR_PTR(error);
1245
1246 svc_reclassify_socket(sock);
1247
1248 if (type == SOCK_STREAM)
1249 sock->sk->sk_reuse = 1;
1250 error = kernel_bind(sock, sin, len);
1251 if (error < 0)
1252 goto bummer;
1253
1254 newlen = len;
1255 error = kernel_getsockname(sock, newsin, &newlen);
1256 if (error < 0)
1257 goto bummer;
1258
1259 if (protocol == IPPROTO_TCP) {
1260 if ((error = kernel_listen(sock, 64)) < 0)
1261 goto bummer;
1262 }
1263
1264 if ((svsk = svc_setup_socket(serv, sock, &error, flags)) != NULL) {
1265 svc_xprt_set_local(&svsk->sk_xprt, newsin, newlen);
1266 return (struct svc_xprt *)svsk;
1267 }
1268
1269bummer:
1270 dprintk("svc: svc_create_socket error = %d\n", -error);
1271 sock_release(sock);
1272 return ERR_PTR(error);
1273}
1274
1275